Java中的潜在内存泄漏,此代码是否会导致内存泄漏?
假设我有一个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) {
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
。