我班上有一个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之后没有删除旧实例。有关这个问题的任何想法?
答案 0 :(得分:3)
几乎没有可能:
a)对bigObject
的引用发布在FancyClass
之外的某处,因此gc无法收集它
b)bigObject.prune
并不像你期望的那么小
c)内存问题是由程序的另一部分引起的
最强大,最直接的解决方案是在分析器下运行程序(例如JVisualVm) 然后,您可以看到有多少BigObject类的实例,它们的大小以及谁拥有对它们的引用。
对你的程序进行2次堆转储也很有帮助:例如5分钟后30分钟,按类别比较对象的数量/大小。如果BigObject
实例的数量显着增加,则可能存在内存泄漏。