我们假设我有一个数组a
,其中数组的类型为T
。将元素设置为null会将其标记为垃圾回收。
例如,如果我执行a[36] = null
,或者我还需要更多内容,例如还要将T
类型的对象中的字段设置为null
?
答案 0 :(得分:2)
在Java中,对象存储在堆上,而变量/引用存储在堆栈中。 GC执行所谓的“循环”,它检查哪些变量不再引用实际数据类型,以及检查范围内是否仍引用了对象。正如马里奥所提到的,当没有任何对象引用它时,最终会收集一个对象,但是在一些性能/内存关键应用程序中,将对象设置为null并尝试加速垃圾收集过程已知可以提供边际性能优势。在这种情况下,我不会太担心它。
答案 1 :(得分:1)
正如其他人所说,没有代码就很难说清楚。但是,这可能会有所帮助:
根据Josh Bloch的 Effective Java 2nd Edition 第2章第6项,您需要将引用设置为null
,以使其成为GC' d 如果您管理自己的内存。他解释说,如果您没有null
引用它可能会成为过时的引用,这些可能会导致OutOfMemoryError
。
他给出的例子如下(我缩短了它)。考虑一个堆栈实现,您可以在其中推送和弹出对象。问题出现在pop
操作中:
public class Stack {
private Object[] elements;
private int size = 0;
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; // Eliminate obsolete reference, or you'll have a "memory leak"
return result;
}
请注意,您使用size
变量手动控制分配的大小,GC无法知道哪些元素已分配,哪些元素是免费的。
如果您发现相关信息,请继续阅读本书中的该部分以获取更多信息。你的案子与我写的有相似之处,但我们无法在没有代码的情况下确定。