2016-02-05 209 views
3

让我说我有一个Java代码,它不断运行,每分钟应该得到一个真正沉重的对象数组,并继续他们。下面的代码做这项工作:Java中潜在的内存泄漏,这段代码是否会导致内存泄漏?

while (true) { 

    ArrayList<HeavyObject> objArr = this.getHeavyObject(); 
    drv.processObject(objArr); 

    try { 
     Thread.sleep(60000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

我的问题是:
可能这个代码导致内存泄漏执行ArrayList<HeavyObject> objArr = this.getHeavyObject();时没有得到新一批重物前分配objArr = null

按照«Memory leaks in Java»文章,如果我不离开变量的范围是使用分配给null重要(此代码是main()的一部分,是活的,直到我退出程序)。

你能澄清这方面适用于上面列出的代码?

回答

1

只要drv对象不保留对objArr的引用,代码中就不会有泄漏。对于“重对象”的参考objArr仅限于while循环的范围,因此一旦您离开迭代,就有资格进行垃圾回收。 但是,如果drv保持对该对象的永久引用,则只要该引用持续存在,它就不会被收集。

您提到的链接中的示例是对数据的引用超出范围时(在他们的示例中,Stack类的E[]数组字段)并且无法收集。

1

它确实有所作为。

正常情况下,如果将其设置为空或其他值,并不重要。重新分配objArr可以减少引用计数,并可以对阵列进行GC分析。

但是,如果数组太大以至于无法同时在内存中放入其中的两个,则可能会有所帮助,因为如果在调用之前将引用设置为null,则当前数组可以是GC:在为下一个数组分配内存之前编辑。

+0

我只是在文章中的例子,其中作者声称没有'array [N] = null;'内存会泄漏困惑我,为什么在我的代码中没问题,但在他的例子中它是这样做的问题?这是因为'pop()'只是返回元素,但不对数组执行任何操作,它是元素赋值? –

+1

他的例子等同于您保留对旧数组的引用。当一个对象从堆栈中弹出时,堆栈不应该保持对该对象的引用,因此'array [N] = null;'。不同之处在于他没有任何新值(直到有人调用'push'),这就是为什么他的代码赋值为null。 –