垃圾回收如何识别孤立对象?

How does Garbage Collection identify orphaned objects?

给定这样的内存状态:

(1) GC root -> A
(2) GC root -> B
(3) B -> GC root

其中“->”表示 "has a reference to"。 现在想象一下,删除从 GC rootAB 的引用。我知道 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 中,可以从堆中访问堆栈并不重要。只是堆数据无法从栈中获取。