JVM垃圾处理

JVM的垃圾回收器

1.serial + serialold

序列化的单线程回收,伴随JAVA诞生就有,现在基本不用

2. PS+PO(parallel scavenge+parallel old)

JDK默认的垃圾回收器,适用内存(几百M-几G)
并行化垃圾回收器,几百兆内存 ,容易产生内存碎片,STW时间较长

3.Pernew+CMS+serial old

适用内存(20G)
并发的垃圾回收,物理和逻辑上都是分区的新生代和老年代,回收原理有四个主要阶段:

  1. initial Mark 初始化标记,有短暂STW
  2. concurrent mark 并发标记,无STW
  3. remark 重新标记,由于第二阶段的并发标记,垃圾回收器在回收垃圾对象的同时,用户线程在工作,并且产生垃圾,所以这个阶段会重新标记,此阶段会有短暂STW
  4. concurrent sweep 并发回收,将未被标记的对象清除,无STW

采用的标记算法:三色标记

  1. 将自身被标记且引用的对象被标记的对象标记为黑色
  2. 将自身被标记且其引用对象未被标记的对象标记为灰色
  3. 将自身未被标记的对象标记为白色

由于标记是并发执行的,所以难免会出现灰色节点指向白色节点的引用消失的同时出现黑色节点引用该白色节点的引用现象,此时用到了remark重新标记,即increamental update增量更新,将黑色重新标记为灰色,重新扫描其所有子节点

4.G1

jdk7及以后,适用内存(百G)
并发的垃圾回收,物理已经不分代,逻辑上有分区region,分代即 新生代(Eden+2servivor)+老年代+humongous(大对象区)。
G1新老年代的比例是5%-60%,该比例一般不手工指定,他会自动调整新老年代的内存比例,用来优化STW,G1也会产生FGC
G1的region中有RemeberSet,记录了其他region指向了该region的引用

回收原理:
mixedGC阶段相当于CMS:

  1. initial Mark 初始化标记,有短暂STW
  2. concurrent mark 并发标记,无STW
  3. remark 重新标记,由于第二阶段的并发标记,垃圾回收器在回收垃圾对象的同时,用户线程在工作,并且产生垃圾,所以这个阶段会重新标记,此阶段会有短暂STW
  4. 筛选回收 并行回收,将未被标记的对象清除,标记的同时进行压缩整理,将region中存活的对象copying至之前连续的region中,并将该region整片回收,有短暂的STW

采用的标记算法:三色标记

  1. 将自身被标记且引用的对象被标记的对象标记为黑色
  2. 将自身被标记且其引用对象未被标记的对象标记为灰色
  3. 将自身未被标记的对象标记为白色

由于标记是并发执行的,所以难免会出现灰色节点指向白色节点的引用消失的同时出现黑色节点引用该白色节点的引用现象,此时更新了remark标记算法,STAB(snapshot at the begining)初始引用快照,将消失的灰色指向白色的引用压栈,在重新标记时将该栈中的引用出栈,结合RSet,遍历RSet中的外部引用,如果没有则不标记,如果还存在外部标记,则标记为灰色

5.ZGC

JDK11,适用内存(4T-16T)改进了标记算法,将三色标记改进为颜色指针,直接在对象的引用中加了3位标记引用的变化,废弃了RSet

6.Shenandoah

猜你喜欢

转载自blog.csdn.net/weixin_45658376/article/details/108115563