在Scala收集的旧堆gen空间没有被收集

时间:2016-02-27 09:27:48

标签: java scala garbage-collection

我在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时,eden和幸存者空间经常是GCing,并且没有使用太多的内存。然而,旧的gen空间的GC没有做任何事情,并且使用了大量的内存。

这可能是因为非常大的数组直接进入Old Gen空间然后因为数组是方法的返回类型而没有被解除引用吗?

1 个答案:

答案 0 :(得分:0)

垃圾收集很昂贵。你的内存不足吗?如果没有,如果程序结束时所有内存都被释放回操作系统,为什么系统会运行如此昂贵的操作呢?

正如评论中提到的,你的数组大约是560 kByte(547 KiByte)。在大多数现代计算机上,保持这么多的内存比实际需要的时间长一点并不是一个严重的问题。因此,如果系统无论如何都不会产生太大影响,系统将避免运行如此昂贵的操作。 (对于典型的Scala计划,547 KiByte或多或少并不明显。)