2016-02-27 66 views
1

我在scala中編寫代碼,我有幾個方法返回非常大的數組(大小約70000)。我跑的形式的東西:舊堆堆空間不被垃圾收集在斯卡拉

object x { 
def returnArray(y: Int): Array[Double] = { 
... \\returns a large array 
    } 
def calculateAverage(largeArray: Array[Double]) : Double = { 
...\\ takes the large array and calculates the average number. 
    } 
} 

我運行JConsole的伊甸園和生存空間往往不GCing太正在使用的內存時被發現。然而,舊的gen空間的GC沒有做任何事情,並且使用了大量的內存。

難道這是由於非常大的數組直接進入舊的Gen空間,然後因爲數組是返回類型的方法,他們不被解除引用?

+0

70K元素將在MB周圍,即使是便宜的手機也適用,所以不是「非常大」。你的意思是7億個元素,其中幾個GB?順便說一句VisualVM或飛行記錄器可能會更好。 –

+0

jconsole和VisualVM創建相當多的垃圾只是監視你的應用程序,這將使它很難看出差異。順便說一句,你確定收集完整的收藏? –

+1

@PeterLawrey'Array [Double]'是java中的double []' – Odomontois

回答

0

垃圾收集很貴。你內存不足了嗎?如果不是,那麼當程序結束時,如果所有內存都被釋放回操作系統,爲什麼系統會運行如此昂貴的操作?正如在評論中提到的,你的數組大約爲560  kByte(547  KiByte)big。在大多數現代計算機上,將這麼多的內存保留在比實際需要的時間更長的時間內並不是真正的問題。因此,如果系統無論如何不會產生太大的影響,系統將避免執行如此昂貴的操作。 (547  KiByte或多或少對於一個典型的Scala程序來說不是很明顯)。