(JVM) 对JVM三色标记算法的理解

前提

自从接触java开始就了解到jvm,但是没怎么系统的了解过,所以从今天开始就记录下个人对jvm相关的理解,

对JVM对象存活判定

引用计数法

  1. 引用计数(Reference Count)是一个简单而有效的管理对象生命周期的方式。当我们创建一个新对象的时候,它的引用计数为 1,当有一个新的指针指向这个对象时,我们将其引用计数加 1,当某个指针不再指向这个对象是,我们将其引用计数减 1,当对象的引用计数变为 0 时,说明这个对象不再被任何指针指向了,这个时候我们就可以将对象销毁,回收内存。由于引用计数简单有效。
  2. 可以发现由这个逻辑来想:
    当两个对象a和对象b ,互相引用对方作为自己的成员变量,成员变量随着对象的创建而存在,随着对象被回收而释放。,也就是说只有在当前变量销毁时,才会对成员变量的引用计数减一, 可以理解为,对象A的销毁依赖着对象B的销毁,对象B的销毁依赖者对象A的销毁,这样就产生了循环引用。即使外部没有指针能够访问他们,但是对象a和b依然不能被释放.

可达性分析

  1. 为了解决这个问题,java使用了可达性分析的方法,通过一系列的“GC Roots” 对象作为起点搜索。
    如果在DC Roots 和一个对象之间没有可达性路行,则称该对象是不可达的,需要注意的是 不可达对象不等价于可回收对象,不可达对象标为可回收对象至少要经历两次标记过程, 两次标记后仍然是可回收对象,则将面临回收

  2. 可作为gc roots的对象有

    1. java虚拟机栈(栈帧的本地变量表)中引用的对象
    2. 本地方法栈中JNI引用对象
    3. 方法区中常量。类静态属性引用的对象

三色标计算法的标记流程

在这里插入图片描述

根据可达性分析算法,从roots开始进行遍历访问。初始状态,所有对象都是白色的,只有GC Roots是黑色的

在这里插入图片描述

第一次初始标记

GC Roots 标记直接关联对象置为灰色
在这里插入图片描述

第二次标记,

初始标记后,进行并发标记,扫描整个引用链。没有子节点的话,将本节点变为黑色,有子节点的话,则将当前节点标为黑色,子节点变为灰色
在这里插入图片描述

重复标记阶段

直至灰色对象没有其他子节点引用时结束。
在这里插入图片描述

扫描完成

此时黑色对象就是存活的对象,白色对象就是已消亡可回收的对象
即(A,D,E,F,G) 可达也就是存活对象,(B,C,H) 不可达可回首的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值