(JVM)对JVM三色标记算法的理解-创新互联
对三色标记算法的理解
名称栏目:(JVM)对JVM三色标记算法的理解-创新互联
链接地址:http://scyanting.com/article/dgssoo.html
- 前提
- 对JVM对象存活判定
- 引用计数法
- 可达性分析
- 三色标计算法的标记流程
- 第一次初始标记
- 第二次标记,
- 重复标记阶段
- 扫描完成
自从接触java开始就了解到jvm,但是没怎么系统的了解过,所以从今天开始就记录下个人对jvm相关的理解,
对JVM对象存活判定 引用计数法- 引用计数(Reference Count)是一个简单而有效的管理对象生命周期的方式。当我们创建一个新对象的时候,它的引用计数为 1,当有一个新的指针指向这个对象时,我们将其引用计数加 1,当某个指针不再指向这个对象是,我们将其引用计数减 1,当对象的引用计数变为 0 时,说明这个对象不再被任何指针指向了,这个时候我们就可以将对象销毁,回收内存。由于引用计数简单有效。
- 可以发现由这个逻辑来想:
当两个对象a和对象b ,互相引用对方作为自己的成员变量,成员变量随着对象的创建而存在,随着对象被回收而释放。,也就是说只有在当前变量销毁时,才会对成员变量的引用计数减一, 可以理解为,对象A的销毁依赖着对象B的销毁,对象B的销毁依赖者对象A的销毁,这样就产生了循环引用。即使外部没有指针能够访问他们,但是对象a和b依然不能被释放.
为了解决这个问题,java使用了可达性分析的方法,通过一系列的“GC Roots” 对象作为起点搜索。
如果在DC Roots 和一个对象之间没有可达性路行,则称该对象是不可达的,需要注意的是 不可达对象不等价于可回收对象,不可达对象标为可回收对象至少要经历两次标记过程, 两次标记后仍然是可回收对象,则将面临回收可作为gc roots的对象有
- java虚拟机栈(栈帧的本地变量表)中引用的对象
- 本地方法栈中JNI引用对象
- 方法区中常量。类静态属性引用的对象
根据可达性分析算法,从roots开始进行遍历访问。初始状态,所有对象都是白色的,只有GC Roots是黑色的
第一次初始标记GC Roots 标记直接关联对象置为灰色
初始标记后,进行并发标记,扫描整个引用链。没有子节点的话,将本节点变为黑色,有子节点的话,则将当前节点标为黑色,子节点变为灰色
直至灰色对象没有其他子节点引用时结束。
此时黑色对象就是存活的对象,白色对象就是已消亡可回收的对象
即(A,D,E,F,G) 可达也就是存活对象,(B,C,H) 不可达可回首的对象
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
名称栏目:(JVM)对JVM三色标记算法的理解-创新互联
链接地址:http://scyanting.com/article/dgssoo.html