Scala:" var" s

时间:2018-03-17 17:33:55

标签: scala java-8 garbage-collection jvm

我班上有一个var对象,由于内容很大,可能会非常大。为了解决大小问题,偶尔我必须创建此类的新实例,其中内容为 pruned 。这就是它是一个可变的"。

我的目标类的高级视图是:

class FancyClass { 
   // this element gets big, but I keep pruning it. 
   var bigObject = initialize()

   def soSth() { 
      bigObject.method1()

      // once in a while I prune this 
      bigObject = bigObject.prune() 
   }
}

bigObject变大了。每隔几次迭代,我就用另一个应该更小的对象替换它:bigObject = bigObject.prune()

问题在于跟踪内存,内存使用率几乎从未缩小。事实上,它一直在变高(而不是内存使用量略有下降)。

我怀疑在bigObject = bigObject.prune() GC之后没有删除旧实例。有关这个问题的任何想法?

1 个答案:

答案 0 :(得分:3)

几乎没有可能: a)对bigObject的引用发布在FancyClass之外的某处,因此gc无法收集它 b)bigObject.prune并不像你期望的那么小 c)内存问题是由程序的另一部分引起的

最强大,最直接的解决方案是在分析器下运行程序(例如JVisualVm) 然后,您可以看到有多少BigObject类的实例,它们的大小以及谁拥有对它们的引用。

对你的程序进行2次堆转储也很有帮助:例如5分钟后30分钟,按类别比较对象的数量/大小。如果BigObject实例的数量显着增加,则可能存在内存泄漏。