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表示白色,所以这里的三色标记算法只是为了让大家更好的理解罢了,希望大家看了我的文章可以有所收获,也希望大家多多关注我,我们一起学习进步,谢谢大家。




相关文章
|
4月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
175 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
3月前
|
算法 Java
JVM有哪些垃圾回收算法?
(1)标记清除算法: 标记不需要回收的对象,然后清除没有标记的对象,会造成许多内存碎片。 (2)复制算法: 将内存分为两块,只使用一块,进行垃圾回收时,先将存活的对象复制到另一块区域,然后清空之前的区域。用在新生代 (3)标记整理算法: 与标记清除算法类似,但是在标记之后,将存活对象向一端移动,然后清除边界外的垃圾对象。用在老年代
32 0
|
4月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
4月前
|
存储 算法 Java
【JVM】垃圾释放方式:标记-清除、复制算法、标记-整理、分代回收
【JVM】垃圾释放方式:标记-清除、复制算法、标记-整理、分代回收
101 2
|
6月前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
1天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
1月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
147 68
|
1月前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
3天前
|
传感器 算法 物联网
基于粒子群算法的网络最优节点部署优化matlab仿真
本项目基于粒子群优化(PSO)算法,实现WSN网络节点的最优部署,以最大化节点覆盖范围。使用MATLAB2022A进行开发与测试,展示了优化后的节点分布及其覆盖范围。核心代码通过定义目标函数和约束条件,利用PSO算法迭代搜索最佳节点位置,并绘制优化结果图。PSO算法灵感源于鸟群觅食行为,适用于连续和离散空间的优化问题,在通信网络、物联网等领域有广泛应用。该算法通过模拟粒子群体智慧,高效逼近最优解,提升网络性能。