Java垃圾收集:在pop()方法中将“栈顶”设置为null是否仅用于GC引用(而不是对象)?

Java垃圾收集:在pop()方法中将“栈顶”设置为null是否仅用于GC引用(而不是对象)?,java,garbage-collection,Java,Garbage Collection,我正在阅读一本Java书籍的旧版本,该书建议在pop中将引用设置为null有助于垃圾收集,特别是用于从堆栈数组中弹出对象 top对象是通过另一个引用从pop方法返回的,所以我假设只将其解引用为null,垃圾收集数组的引用而不是对象 以下是堆栈数组中的pop方法: public Object pop() throws EmptyStackException { Object elem; . . elem = S[top]; S[top--] = null; // derefer

我正在阅读一本Java书籍的旧版本,该书建议在pop中将引用设置为null有助于垃圾收集,特别是用于从堆栈数组中弹出对象

top对象是通过另一个引用从pop方法返回的,所以我假设只将其解引用为null,垃圾收集数组的引用而不是对象

以下是堆栈数组中的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仍然指向此对象。然后返回这个对象,元素引用被销毁,但对象将在调用者方法中被分配另一个引用。因此,堆上的这个对象仍然存在,只是S[top]不再指向它

这似乎是合法的,因为S[top]不应该在对象弹出后引用它,但是它如何帮助垃圾收集呢?仅在参考资料上

我们需要这样做吗?这有助于提高效率吗?

将S[top]设置为null是值得的。对弹出对象的引用返回给调用方,调用方可以对该对象执行任何操作。调用方处理完该对象后,调用方或堆栈就不再需要引用它。只要没有其他对象引用它,那么它就有资格进行垃圾收集

如果堆栈没有清除该条目,那么就没有任何东西可以使其符合垃圾收集的条件,因为堆栈将继续保存对该对象的引用,即使在它被弹出之后也是如此

在堆栈中,数组和对其中对象的任何引用都不会被垃圾收集。只要堆栈存在,堆栈中的数组就仍然存在。引用元素只是设置为null。引用仍然存在,但它现在为null,不再引用对象

清除引用有助于提高内存效率,因为它允许垃圾收集回收弹出对象上的内存,前提是没有其他对象也引用该对象。如果不清除引用,对象将永远不会被垃圾收集,除非堆栈本身及其引用对象的数组被垃圾收集。

值得将S[top]设置为null。对弹出对象的引用返回给调用方,调用方可以对该对象执行任何操作。调用方处理完该对象后,调用方或堆栈就不再需要引用它。只要没有其他对象引用它,那么它就有资格进行垃圾收集

如果堆栈没有清除该条目,那么就没有任何东西可以使其符合垃圾收集的条件,因为堆栈将继续保存对该对象的引用,即使在它被弹出之后也是如此

在堆栈中,数组和对其中对象的任何引用都不会被垃圾收集。只要堆栈存在,堆栈中的数组就仍然存在。引用元素只是设置为null。引用仍然存在,但它现在为null,不再引用对象


清除引用有助于提高内存效率,因为它允许垃圾收集回收弹出对象上的内存,前提是没有其他对象也引用该对象。如果不清除引用,对象将永远不会被垃圾收集,除非堆栈本身及其引用该对象的数组被垃圾收集。

是的,否则数组中的元素将变成过时的对象,垃圾收集器看不到它,因此将永远不会被收集


将其引用为null可能会导致对象符合收集条件,除非在其他任何地方存在其他活动引用。由于对象引用为null,因此没有实际的对象,只有不使用内存的null。因此,执行此操作至关重要,否则可能会发生内存泄漏

是的,否则数组中的元素将变成过时的对象,在垃圾收集器中它是不可见的,因此永远不会被收集


将其引用为null可能会导致对象符合收集条件,除非在其他任何地方存在其他活动引用。由于对象引用为null,因此没有实际的对象,只有不使用内存的null。因此,执行此操作至关重要,否则可能会发生内存泄漏

有效的Java第二版第6项详细介绍了这一确切场景。 简单的回答是,是的,在弹出引用后将其清空是有益的

然而,我认为以下警告更为重要。 当程序员第一次被这个问题刺痛时,他们可能会在程序使用完后立即将每个对象引用置零,从而进行过度补偿。这既不必要也不可取。。。清空对象引用应该是例外,而不是常规

一方不
te:解引用意味着读取变量的值。它与null或设置值无关。

有效的Java第二版第6项详细介绍了这一具体情况。 简单的回答是,是的,在弹出引用后将其清空是有益的

然而,我认为以下警告更为重要。 当程序员第一次被这个问题刺痛时,他们可能会在程序使用完后立即将每个对象引用置零,从而进行过度补偿。这既不必要也不可取。。。清空对象引用应该是例外,而不是常规


旁注:解引用意味着读取变量的值。它与null或设置值无关。

将对废弃对象的引用显式设置为null总是很好的,至少通常非常有用。堆栈没有什么特别之处。将对废弃对象的引用显式设置为null总是很好的,至少通常非常有用。堆栈没有什么特别之处。将引用设置为null不会将对象标记为GC。相反,它会删除对该对象的引用,这样,如果没有其他引用,该对象将符合收集条件。我一直在寻找一个合适的词来描述null引用在垃圾收集方面对该对象的作用,但找不到它,因此改为使用mark。感谢您的更正。将引用设置为null不会将对象标记为GC。相反,它会删除对该对象的引用,这样,如果没有其他引用,该对象将符合收集条件。我一直在寻找一个合适的词来描述null引用在垃圾收集方面对该对象的作用,但找不到它,因此改为使用mark。谢谢你的更正。谢谢你的回答~谢谢你的回答~谢谢你的回答~谢谢你的回答~谢谢你的回答~