Java如何防止尚未分配的实例被垃圾回收?

4

示例:

public void foo() {
    A a = new A();
}

如果发生以下事件序列会怎样?

  1. Java 为 A 分配内存。
  2. A() 构造函数运行。现在堆中有一个实例。
  3. GC 运行。
  4. 在被分配给 a 前,没有对象的引用,所以它被删除。

它如何防止这种情况发生?我非常感谢提供解释的文章链接。


4
栈上有一个对它的引用。那个引用将会被复制到变量 a 中,这样 a 就拥有了对它的引用。 - Sotirios Delimanolis
1
“现在堆中有一个实例。”这句话属于第一点。在为对象分配内存后,即使未初始化,堆内存中仍然存在一个对象。但例如,当构造函数因异常而失败时,垃圾回收器仍需要运行以回收未初始化对象的内存。第四点的逻辑明显有缺陷。如果“没有对该对象的引用”,那么你怎么能将这样的引用分配给a呢? - Holger
1个回答

4
一旦你知道垃圾回收器(GC)是通过调用堆栈来遍历的,这个问题就很容易回答了。因此,当它遍历方法foo的堆栈时,它简单地知道引用a)指向那块堆内存。
为了知道哪些是垃圾,GC必须先扫描所有还活着的东西。由于有指向该内存的引用(new A()),所以它被视为仍然存活,至少在某个线程中使用a之前是这样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接