给定这样的内存状态:
(1) GC root -> A
(2) GC root -> B
(3) B -> GC root
其中“->”表示“引用”。
现在想象一下,删除从 GC root
到 A
和 B
的引用。我知道 A
将被垃圾收集,因为它不再可达。
但是B
呢?它无法从 GC root
访问,但它具有对仍处于 Activity 状态的 GC root
的引用。 B
现在是否已被垃圾回收?或者换句话说:对于查找孤立对象,是否仅在一个方向上进行分析,即从 GC root 到其他对象?
最佳答案
垃圾回收的基本策略是确定堆上的数据是否可以从堆栈访问。如果不是,则释放其内存。
你可以这样想象
STACK *** HEAP *** HEAP *** STACK
GC root. -> A -> b -> GC root
因此,如果您删除 A,您仍然有 B 到达堆栈,但垃圾收集器永远不会到达 B 并将其删除(它仅从左到右/从堆栈到堆遍历)。在示例 B -> root GC 中,可以从堆到达堆栈并不重要。只是无法从堆栈到达堆数据。
关于java - 垃圾收集如何识别孤立对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60930083/