Java 垃圾回收 : Does setting 'top of stack' to null in pop() method only GC the reference (not object)?

标签 java garbage-collection

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

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

这是 Stack 数组中的 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] 不应在弹出对象后引用该对象,但它对垃圾收集有何帮助?仅引用?

我们需要这样做吗?对效率有帮助吗?

最佳答案

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

如果 Stack 没有清除该条目,那么它就没有资格进行垃圾回收,因为 Stack 会继续持有对该对象的引用,即使在它被弹出。

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

清除引用有助于提高内存效率,通过允许垃圾收集回收弹出对象上的内存,假设没有其他对象也引用该对象。如果不清除引用,该对象将永远不会被垃圾回收,除非 Stack 本身(其数组引用该对象)被垃圾回收。

关于Java 垃圾回收 : Does setting 'top of stack' to null in pop() method only GC the reference (not object)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22239511/

相关文章:

java - 使用 jni4net 传递的两种方式对象(是 : Ignore Missing Class(es))

c# - 为什么这个对象没有被垃圾回收

memory - 垃圾收集语言是否可以编译为非垃圾收集语言,而不在运行时包含垃圾收集器?

java - Java ThreadPool中ThreadLocal值是否被GC?

ruby - ObjectSpace - 它是什么以及人们如何使用它?

java - Java堆的标准分配比例

java - 改变java类排序标准的好方法

java - 野蝇 11/Java EE 7/JSR 107 : caching - what's the best way to cache information and let it expire automatically?

java - 只让一个正在运行的线程执行一个 catch block ?

java - 在 Linux 上创建 Minecraft 服务器