假设我有一个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()
的一部分,在我退出程序之前一直存在。)
您能否澄清这个方面适用于上面列出的代码?
答案 0 :(得分:1)
只要drv
对象不维护对objArr
的引用,代码就不会泄漏。对“重物”的引用objArr
仅限于while循环的范围,因此一旦离开迭代,它就有资格进行垃圾收集。
但是,如果drv
维护对象的永久引用,则只要引用仍然存在,就不会收集它。
您提到的链接中的示例是对数据的引用位于范围之外(在其示例中,E[]
类的Stack
数组字段)并且无法收集。
答案 1 :(得分:1)
确实有所作为。
通常,如果将其设置为null或其他值,则无关紧要。重新分配objArr
会减少引用计数,从而可以对阵列进行GC。
但是,如果数组太大而无法同时将两个数组放入内存中,那么它可能会有所帮助,因为如果在调用之前将引用设置为null,那么当前数组可以是GC :在为下一个数组分配内存之前执行ed。