Java中潜在的内存泄漏,这段代码可能会导致内存泄漏吗?

时间:2016-02-05 12:10:51

标签: java memory-leaks garbage-collection

假设我有一个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()的一部分,在我退出程序之前一直存在。)

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

2 个答案:

答案 0 :(得分:1)

只要drv对象不维护对objArr的引用,代码就不会泄漏。对“重物”的引用objArr仅限于while循环的范围,因此一旦离开迭代,它就有资格进行垃圾收集。 但是,如果drv维护对象的永久引用,则只要引用仍然存在,就不会收集它。

您提到的链接中的示例是对数据的引用位于范围之外(在其示例中,E[]类的Stack数组字段)并且无法收集。

答案 1 :(得分:1)

确实有所作为。

通常,如果将其设置为null或其他值,则无关紧要。重新分配objArr会减少引用计数,从而可以对阵列进行GC。

但是,如果数组太大而无法同时将两个数组放入内存中,那么它可能会有所帮助,因为如果在调用之前将引用设置为null,那么当前数组可以是GC :在为下一个数组分配内存之前执行ed。