一 点睛
在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC 才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。
那么在 JVM 中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。
1 判断对象存活一般有两种算法
-
引用计数算法
-
可达性分析算法
引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。
对于一个对象 A,只要有任何一个对象引用了 A,则 A 的引用计数器就加1;当引用失效时,引用计数器就减1。只要对象 A 的引用计数器的值为0,即表示对象 A 不可能再被使用,可进行回收。
2 优点
-
实现简单,垃圾对象便于辨识
-
判定效率高,回收没有延迟性
3 缺点
- 它需要单独的字段存储计数器,这样的做法增加了存储空间的开销。
- 每次赋值都需要更新计数器,伴随着加法和减法操作,这增加了时间开销。
- 引用计数器有一个严重的问题,即无法处理循环引用的情况。这是一条致命缺陷,导致在 Java 的垃圾回收器中没有使用这类算法。
二 循环引用
当 p 的指针断开的时候,内部的引用形成一个循环,这就是循环引用,从而造成内存泄漏

本文探讨了Java垃圾回收机制中的对象标记过程,主要关注引用计数算法及其优缺点。通过实例展示了Java并非使用引用计数算法,而是通过可达性分析来判断对象是否可回收,以避免循环引用问题。最终,测试结果验证了Java的垃圾回收不依赖引用计数,而是采用了更复杂的策略。
最低0.47元/天 解锁文章
1万+





