Java 如何防止尚未分配的实例被垃圾收集?
How does Java prevent an as yet unassigned instance from being garbage collected?
示例:
public void foo() {
A a = new A();
}
如果有这一系列事件怎么办?
- Java为A分配内存。
A()
构造函数运行。现在堆中有一个实例。
- GC 运行。
- 该对象没有引用,在分配给
a
之前将其删除。
它如何防止这种情况发生?我将非常感谢链接到解释它的文章。
一旦您知道 call stack is traversed by the garbage collector (GC). So when it traverses the stack of the method foo
, it simply knows that there are references (a
) 指向该堆内存,这就很容易回答了。
为了知道什么是垃圾,GC 必须首先扫描所有存活的东西。由于有指向该内存的引用(new A()
);至少在 a
被某个线程在某处使用之前,它被视为活着。
示例:
public void foo() {
A a = new A();
}
如果有这一系列事件怎么办?
- Java为A分配内存。
A()
构造函数运行。现在堆中有一个实例。- GC 运行。
- 该对象没有引用,在分配给
a
之前将其删除。
它如何防止这种情况发生?我将非常感谢链接到解释它的文章。
一旦您知道 call stack is traversed by the garbage collector (GC). So when it traverses the stack of the method foo
, it simply knows that there are references (a
) 指向该堆内存,这就很容易回答了。
为了知道什么是垃圾,GC 必须首先扫描所有存活的东西。由于有指向该内存的引用(new A()
);至少在 a
被某个线程在某处使用之前,它被视为活着。