Java中可能存在内存泄漏,这段代码是否可能导致内存泄漏?

3

假设我有一段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赋值时,这段代码是否会导致内存泄漏?

根据《Java中的内存泄漏》文章,如果我不离开变量范围(此代码是main()的一部分,并且在退出程序之前一直存在),使用将变量赋值为null非常重要。

您能否澄清上述代码的这个方面?

2个回答

1
只要drv对象不保留对objArr的引用,您的代码中就不会有泄漏。对于"重型对象"的引用objArr仅限于while循环的范围内,因此一旦离开迭代,它就可以进行垃圾回收。但是,如果drv保持对该对象的永久引用,则只要引用存在,它就不会被回收。
您提到的链接中的示例是当数据的引用位于作用域之外(在他们的示例中,位于Stack类的E[]数组字段中)且无法被回收时。

1

这确实有所不同。

通常,将其设置为null或其他值并不重要。重新分配 objArr 会减少引用计数,并使数组能够进行垃圾回收。

然而,如果数组太大,以至于您无法同时将两个数组放入内存中,那么它可能会有所帮助,因为如果在调用之前将引用设置为null,则可以在为下一个数组分配内存之前对当前数组进行垃圾回收。


这正是我所想的,但文章中的例子让我感到困惑。作者声称如果没有 array[N] = null;,内存将会泄漏。为什么在我的代码中它没问题,但在他的例子中会出现问题?这是因为 pop() 只返回元素,而不对数组和其元素进行任何操作和赋值吗? - Mike
1
他的例子相当于你保留对旧数组的引用。当从堆栈中弹出一个对象时,堆栈不应该保留对该对象的引用,因此 array[N] = null;。区别在于他没有任何新值(直到有人调用 push),这就是为什么他的代码赋值为 null 的原因。 - Klas Lindbäck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接