Java中的潜在内存泄漏,此代码是否会导致内存泄漏?

Java中的潜在内存泄漏,此代码是否会导致内存泄漏?,java,memory-leaks,garbage-collection,Java,Memory Leaks,Garbage Collection,假设我有一个Java代码,它不断地运行,每分钟都应该得到一个真正沉重的对象数组并继续它们。以下代码执行此任务: while (true) { ArrayList<HeavyObject> objArr = this.getHeavyObject(); drv.processObject(objArr); try { Thread.sleep(60000); } catch (InterruptedException e) {

假设我有一个Java代码,它不断地运行,每分钟都应该得到一个真正沉重的对象数组并继续它们。以下代码执行此任务:

while (true) {

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

    try {
        Thread.sleep(60000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
while(true){
ArrayList objArr=this.getHeavyObject();
drv.processObject(objArr);
试一试{
睡眠(60000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
我的问题是:
执行
ArrayList objArr=this.getHeavyObject()时,此代码是否会导致内存泄漏未分配
objArr=null

根据«»文章,如果我没有离开变量的作用域,那么使用赋值给
null
是很重要的(此代码是
main()
的一部分,在我退出程序之前一直处于活动状态)


您能否澄清应用于上述代码的这一方面?

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


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

这确实会有所不同

通常,将其设置为null或其他值并不重要。重新分配
objArr
会减少引用计数,并使GC阵列成为可能


但是,如果数组太大,无法同时在内存中容纳其中两个数组,则可能会有所帮助,因为如果在调用之前将引用设置为null,则可以在为下一个数组分配内存之前对当前数组进行GC:ed

这就是我所想的,但是文章中的例子,作者声称没有
array[N]=null内存会泄漏让我很困惑,为什么在我的代码中它是可以的,但在他的示例中它会出现问题?这是因为
pop()
只返回元素,而不对数组及其元素赋值执行任何操作吗?他的示例相当于保留对旧数组的引用。从堆栈中弹出对象时,堆栈不应保留对该对象的引用,因此
array[N]=null。区别在于他没有任何新值(直到有人调用
push
),这就是为什么他的代码分配
null