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




相关文章
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
63 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
1月前
|
存储 算法 Java
【JVM】垃圾释放方式:标记-清除、复制算法、标记-整理、分代回收
【JVM】垃圾释放方式:标记-清除、复制算法、标记-整理、分代回收
49 2
|
3月前
|
存储 算法 Java
JVM自动内存管理之垃圾收集算法
文章概述了JVM内存管理和垃圾收集的基本概念,提供一个关于JVM内存管理和垃圾收集的基础理解框架。
JVM自动内存管理之垃圾收集算法
|
3月前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
26天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
10天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
12天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
12天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。
|
12天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。