JVM之三色标记算法

简介: 可达性分析算法它分析完了以后是怎样进行记录的呢,它怎么知道哪些是垃圾对象哪些不是垃圾对象呢,今天我们来讲解一下三色标记算法。

前言



前面的文章里讲到过JVM通过可达性分析算法进行垃圾回收,那么可达性分析算法它分析完了以后是怎样进行记录的呢,它怎么知道哪些是垃圾对象哪些不是垃圾对象呢,今天我们来讲解一下三色标记算法。下面我先介绍一下理论,但是单看理论可能太抽象,请再结合我后面的图片进行分析思考。


理论



黑色:表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过。黑色的对象代表已经扫描过,它是安全存活的。


灰色:表示对象已经被垃圾收集器访问过,但是这个对象上至少存在一个引用还没有被扫描过。


白色:表示对象尚未被垃圾收集器访问过。


图片分析



38.png


图中黑色箭头代表对象之间的引用,红色箭头代表垃圾收集器扫描的路径,第一张图因为扫描器还没有进行扫描,所以所有的对象都是白色的。


一、第一次扫描


39.png


第一次扫描到了A对象,但是A对象下面的直接引用对象还有未扫描到的对象B和对象C,所以A对象为灰色。


二、第二次扫描


40.png


第二次扫描到了B对象,但是B对象下面还有一个直接引用对象D没有被扫描到,所以B对象变为灰色,然而A对象下面有一个直接引用对象C没有被扫描到,所以A对象也还是灰色。这里再次强调一下红色连线代表扫描的路径以及扫描到的对象,黑色连线代表对象之间的引用,之所以画两个箭头引用就是为了让大家区分开箭头所代表的不同含义。


三、第三次扫描


41.png


第三次扫描从A对象扫描到了B对象,由于B对象下面没有未被扫描的对象了(因为B下面已经没有引用的对象了),所以B为黑色,而A对象也因为下面的直接引用对象B和C都已经被扫描过了,所以A也变为了黑色,而B下面的D对象还没有被扫描过,所以B还是灰色。


四、第四次扫描


42.png


第四次扫描从B扫描到了D对象,因为D对象下面没有引用对象了,所以D变为黑色了,而B下面也没有未被扫描过的对象了,所以B对象也变为了黑色,这个时候扫描器就结束扫描过程了,大家看到了扫描器并没有扫描E对象,这是因为两点,1、E对象不是GCRoot根,扫描器是从GCRoot根节点开始扫描的,也就是从图中A对象开始扫描。2、E对象没有被GCRoot根节点或者根节点引用下的节点引用,假如这个时候A、B、C、D任何一个对象引用E对象,E对象都会变为黑色,而目前图中的E对象就相当于我们在程序里面new了一个Strudent对象,但是没有任何对象使用它或者调用它,它就相当于在程序里面“悬空”了,所以垃圾收集器会在后面的垃圾收集阶段将白色的E对象收集掉,其他的对象不会收集。


总结




这里的三色标记算法并不是在程序内部真正的将对象标记成为黑色、灰色、白色,而是可能用了两个二进制位来表示,比如00表示黑色、01表示灰色、10表示白色,所以这里的三色标记算法只是为了让大家更好的理解罢了,希望大家看了我的文章可以有所收获,也希望大家多多关注我,我们一起学习进步,谢谢大家。




相关文章
|
5天前
|
JavaScript 前端开发 算法
JavaScript的垃圾回收机制通过标记-清除算法自动管理内存
【5月更文挑战第11天】JavaScript的垃圾回收机制通过标记-清除算法自动管理内存,免除开发者处理内存泄漏问题。它从根对象开始遍历,标记活动对象,未标记的对象被视为垃圾并释放内存。优化技术包括分代收集和增量收集,以提升性能。然而,开发者仍需谨慎处理全局变量、闭包、定时器和DOM引用,防止内存泄漏,保证程序稳定性和性能。
18 0
|
5天前
|
算法 Java
深入浅出JVM(十六)之三色标记法与并发可达性分析
深入浅出JVM(十六)之三色标记法与并发可达性分析
|
5天前
|
安全 算法 Java
深入浅出JVM(十三)之垃圾回收算法细节
深入浅出JVM(十三)之垃圾回收算法细节
|
5天前
|
存储 算法 Java
深入浅出JVM(十二)之垃圾回收算法
深入浅出JVM(十二)之垃圾回收算法
|
5天前
|
算法 Java PHP
JVM 的垃圾回收机制以及垃圾回收算法的详解
JVM 的垃圾回收机制以及垃圾回收算法的详解
11 0
|
5天前
|
Arthas 监控 算法
JVM工作原理与实战(二十五):堆的垃圾回收-垃圾回收算法
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了垃圾回收算法评价标准、标记清除算法、复制算法、标记整理算法、分代垃圾回收算法等内容。
23 0
JVM工作原理与实战(二十五):堆的垃圾回收-垃圾回收算法
|
5天前
|
算法 Java
JVM 垃圾回收算法(重要)
JVM 垃圾回收算法(重要)
|
5天前
|
存储 缓存 算法
深度解析JVM世界:垃圾判断和垃圾回收算法
深度解析JVM世界:垃圾判断和垃圾回收算法
|
5天前
|
算法 Java UED
【JVM】分代收集算法:提升Java垃圾回收效率
【JVM】分代收集算法:提升Java垃圾回收效率
26 0
|
5天前
|
算法 Java
深入了解JVM和垃圾回收算法
深入了解JVM和垃圾回收算法
27 0