java - 垃圾收集如何识别孤立对象?

标签 java android garbage-collection

给定这样的内存状态:

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

其中“->”表示“引用”。 现在想象一下,删除从 GC rootAB 的引用。我知道 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/

相关文章:

java - map 未显示

C# GC.Collect 如果对象是使用实例构造函数初始值设定项构造的,则不会销毁该对象

c# - 线程和垃圾收集

java - 如何使用XZ lib在android中压缩/解压缩文件

java - 水平 EditText 一次滚动一个字符

java - 有效地生长原子阵列

java - CMS Old GC触发的阈值是多少

java - 如何从 onProgressUpdate 和 onPostExecute 获得响应

java - Android: ListView 的 android:dividerHeight 的默认值是多少

android - 如何从手机设置中卸载应用程序时显示警报消息