什么时候对象符合垃圾收集条件?

Dor*_*thy 14 java garbage-collection

在下面的代码中,给定amethod已被调用.在什么点/行是最初引用的对象myObject,有资格获得垃圾收集?

class Test {
  private Object classObject;

  public void amethod() {
    Object myObject = new Object();
    classObject = myObject;
    myObject = null;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果classObject或者amethod有一个公共,受保护,默认或静态的访问修饰符,它会影响对象符合垃圾收集的条件吗?如果是这样,它将如何受到影响?

  • 我首先想到的是,当Test对象符合垃圾收集条件时,Object符合垃圾收集条件.
  • 但话又说回来.优化器可能知道从不读取classObject,在哪种情况下classObject = myObject;将被优化,并且myObject = null;它有资格获得垃圾收集.

kol*_*sus 18

在丢弃对它的所有引用之前,该对象不会成为垃圾收集的候选对象.Java对象是通过引用分配的,所以当你有

   classObject = myObject;
Run Code Online (Sandbox Code Playgroud)

您为堆上的同一对象分配了另一个引用.所以这一行

   myObject = null;
Run Code Online (Sandbox Code Playgroud)

只删除一个引用.要成为myObject垃圾收集的候选人,你必须拥有

  classObject = null;
Run Code Online (Sandbox Code Playgroud)


BER*_*ine 6

摘自《OCA Java SE 7》一书

\n\n
\n

当对象无法再被访问时,该对象将被标记为有资格进行垃圾收集,当对象超出范围时,就会发生这种情况。当对象\xe2\x80\x99s 引用变量被分配显式空值或重新初始化时,也会发生这种情况。

\n
\n