对象何时符合垃圾回收条件?

2022-09-03 00:13:20

在下面的代码中,给定已调用。最初引用的对象在哪个点/行符合垃圾回收的条件?amethodmyObject

class Test {
  private Object classObject;

  public void amethod() {
    Object myObject = new Object();
    classObject = myObject;
    myObject = null;
  }
}

如果或具有公共、受保护、默认或静态的访问修饰符,是否会影响对象符合垃圾回收条件的点?如果是这样,它将受到什么影响?classObjectamethod

  • 我的第一个想法是,当 Test 对象符合垃圾回收的条件时,该对象符合垃圾回收的条件。
  • 但话又说回来。优化程序可能知道永远不会从中读取类对象,在这种情况下,它将被优化出来,并且它有资格进行垃圾回收。classObject = myObject;myObject = null;

答案 1

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

   classObject = myObject;

您为堆上的同一对象分配了另一个引用。所以这条线

   myObject = null;

只删除一个引用。要成为垃圾回收的候选者,您必须具有myObject

  classObject = null;

答案 2

来自 OCA Java SE 7

当无法再访问对象时,该对象被标记为有资格进行垃圾回收,当对象超出范围时,可能会发生这种情况。当为对象的引用变量分配显式 null 值或重新初始化时,也会发生这种情况。