垃圾回收如何识别孤立对象?
How does Garbage Collection identify orphaned objects?
给定这样的内存状态:
(1) GC root -> A
(2) GC root -> B
(3) B -> GC root
其中“->”表示 "has a reference to"。
现在想象一下,删除从 GC root
到 A
和 B
的引用。我知道 A
将被垃圾收集,因为它不再可用。
但是 B
呢?它无法从 GC root
访问,但它有对 GC root
的引用,后者仍然存在。 B
现在是否被垃圾收集?或者换句话说:对于查找孤立对象,分析是否只在一个方向上进行,从 GC root 到其他对象?
垃圾回收的基本策略是判断堆上的数据是否可以从栈上到达。如果不是,请释放其内存。
你可以想象成这样
STACK *** HEAP *** HEAP *** STACK
GC root. -> A -> b -> GC root
因此,如果您删除 A,您仍然有 B 到达堆栈,但垃圾收集器永远不会到达 B 并将其删除(它仅从左侧遍历到 right/from 堆栈到堆)。在您的示例 B -> root GC 中,可以从堆中访问堆栈并不重要。只是堆数据无法从栈中获取。
给定这样的内存状态:
(1) GC root -> A
(2) GC root -> B
(3) B -> GC root
其中“->”表示 "has a reference to"。
现在想象一下,删除从 GC root
到 A
和 B
的引用。我知道 A
将被垃圾收集,因为它不再可用。
但是 B
呢?它无法从 GC root
访问,但它有对 GC root
的引用,后者仍然存在。 B
现在是否被垃圾收集?或者换句话说:对于查找孤立对象,分析是否只在一个方向上进行,从 GC root 到其他对象?
垃圾回收的基本策略是判断堆上的数据是否可以从栈上到达。如果不是,请释放其内存。
你可以想象成这样
STACK *** HEAP *** HEAP *** STACK
GC root. -> A -> b -> GC root
因此,如果您删除 A,您仍然有 B 到达堆栈,但垃圾收集器永远不会到达 B 并将其删除(它仅从左侧遍历到 right/from 堆栈到堆)。在您的示例 B -> root GC 中,可以从堆中访问堆栈并不重要。只是堆数据无法从栈中获取。