我正在阅读旧版Java书,建议在pop()
中设置对null的引用有助于垃圾收集,特别是从堆栈数组中弹出一个对象。
顶级对象是通过另一个引用从pop()
方法返回的,所以我假设将它解除引用为null只是垃圾收集数组的引用(而不是对象)?
这是Stack Array中的pop()方法:
public Object pop() throws EmptyStackException {
Object elem;
.
.
elem = S[top];
S[top--] = null; // dereference S[top] for garbage collection
return elem;
}
因此,S[top]
和S[top]
都会引用elem
的对象。取消引用S[top]
后,elem
仍然指向此对象。然后返回此对象,elem引用被销毁,但对象将在调用方法中分配另一个引用。所以,堆上的这个对象仍然存在,只是S[top]
不再指向它。
这似乎是合法的,因为S[top]
在弹出对象后不应引用该对象,但它如何帮助进行垃圾回收?仅在参考?
我们需要这样做吗?它对提高效率有帮助吗?
答案 0 :(得分:3)
将S[top]
设置为null
是值得的。对弹出对象的引用将返回给可以对该对象执行任何操作的调用方。当调用者完成该对象后,调用者或Stack
不再需要引用它。只要没有其他对象引用它,它就有资格进行垃圾收集。
如果Stack
没有清除该条目,则没有任何东西可以使其符合垃圾回收的条件,因为Stack
即使在弹出后也会继续保持对该对象的引用。
在Stack
中,数组和对其中对象的任何引用都不是垃圾回收。只要Stack
,Stack
中的数组仍然存在。引用元素仅设置为null
。引用仍然存在,但它现在是null
,它不再引用该对象。
通过允许垃圾收集回收弹出对象上的内存来清除引用有助于提高内存效率,假设其他任何内容都没有引用该对象。在不清除引用的情况下,对象永远不会被垃圾回收,除非Stack
本身(其数组引用该对象)被垃圾收集。
答案 1 :(得分:2)
这个确切的场景在Effective Java(第2版)第6项中有详细介绍。 简短的回答是肯定的,弹出它后将引用置零是有益的。
然而,我认为以下警告更为重要 “当程序员第一次被这个问题所困扰时,他们可能会在程序使用完毕后通过将每个对象引用归零来过度补偿。这既不必要也不可取...... 取消对象引用应该是例外而不是比常规。“
旁注:解除引用表示读取变量的值。它与null或设置值无关。
答案 2 :(得分:0)
是的,否则数组中的元素将变成一个过时的对象,它在垃圾收集器中是不可见的,因此永远不会被收集。
将其引用到null
会导致该对象有资格进行收集(除非其他地方还有其他活动引用)。由于对象引用是null
,因此没有实际对象,只有null
不使用内存。因此,执行此操作至关重要,否则可能会遇到内存泄漏。