GC 深入(小白,对gc有一个进一步的了解)

垃圾回收器的搭配 一般固定

一般这年轻代垃圾回收器,老年代垃圾回收器,如上图搭配着使用

1.8呢默认就是最后边那哥俩

jvm调优 一个就是增加吞吐量 一个就是减少STW的时间。

三色标记算法(理解根可达算法) 并发的可达性分析

有黑白灰三个颜色

最开始的颜色都是白色

刚找到这个对象的时候,把他标记成灰色,然后他的孩子级别的对象都找到时。 把他标记成黑色。他的孩子就是灰色了。

关于可达性分析的扫描过程,读者不妨发挥一下想象力,把它看作对象图上一股以灰色为波峰的

波纹从黑向白推进的过程,如果用户线程此时是冻结的,只有收集器线程在工作,那不会有任何问

题。但如果用户线程与收集器是并发工作呢?收集器在对象图上标记颜色,同时用户线程在修改引用关系------即修改对象图的结构,这样可能出现两种后果。一种是把原本消亡的对象错误标记为存活,这不是好事,但其实是可以容忍的,只不过产生了一点逃过本次收集的浮动垃圾而已,下次收集理掉就好。另一种是把原本存活的对象错误标记为已消亡,这就是非常致命的后果了,程序肯定会因此发生错误

并发出现"对象消失"问题的示意

Wilson于1994年在理论上证明了,当且仅当以下两个条件同时满足时,会产生"对象消失"的问

题,即原本应该是黑色的对象被误标为白色:
·赋值器插入了一条或多条从黑色对象到白色对象的新引用;
·赋值器删除了全部从灰色对象到该白色对象的直接或间接引用。

因此,我们要解决并发扫描时的对象消失问题,只需破坏这两个条件的任意一个即可。由此分别

产生了两种解决方案:增量更新(Incremental Update)和原始快照(Snapshot At The Beginning,

SATB)。

增量更新要破坏的是第一个条件,当黑色对象插入新的指向白色对象的引用关系时,就将这个新

插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次。这可以简化理解为,黑色对象一旦新插入了指向白色对象的引用之后,它就变回灰色对象了。

原始快照要破坏的是第二个条件,当灰色对象要删除指向白色对象的引用关系时,就将这个要删

除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描一次。这也可以简化理解为,无论引用关系删除与否,都会按照刚刚开始扫描那一刻的对象图快照来进行搜索。

以上无论是对引用关系记录的插入还是删除,虚拟机的记录操作都是通过写屏障实现的。在

HotSpot虚拟机中,增量更新和原始快照这两种解决方案都有实际应用,譬如,CMS是基于增量更新来做并发标记的,G1、Shenandoah则是用原始快照来实现。

相关推荐
爪哇斗罗9 小时前
JVM调优篇之JVM基础入门AND字节码文件解读
jvm
王佑辉12 小时前
【jvm】java对象的访问定位
jvm
不止会JS14 小时前
JVM详解:垃圾回收机制
jvm
guihong00414 小时前
JAVA面试题、八股文学习之JVM篇
java·jvm·学习
gogo_hua15 小时前
JVM系列之OOM观测准备
java·大数据·jvm
柯3491 天前
GC垃圾回收
java·jvm·垃圾回收
王佑辉1 天前
【jvm】执行引擎是做什么
jvm
平头哥在等你1 天前
C语言简答题答案
java·c语言·jvm
zhuzhihongNO11 天前
JVM(JAVA虚拟机)内存溢出导致内存不足,Java运行时环境无法继续
java·开发语言·jvm·内存溢出·jvm内存溢出