3.4 G1

image-20230318234336245

jdk1.8不是默认开启的,需要用-XX:+UseG1GC来启用

在这里插入图片描述


2023/5/21 更新,回顾下垃圾回收器

3.4.0 CMS和G1的区别

CMS和G1都是为了降低延迟时间的垃圾回收器,也就是降低STOP THE WORLD (STW)的时间。

和吞吐量优先的Parallel算法的区别是,Parallel并没有让用户线程和垃圾回收的线程同步执行的阶段

CMS和G1的前三个阶段, 初始标记,并发标记,以及最终标记,都是在标记需要清理的对象,而没有进行实际的操作,直到最后一个阶段才会进行清理,CMS用的是标记-清理的方法,且和用户线程同步执行,会产生浮动垃圾,到下一次GC才能清理到,而G1则是会触发STW,进行全线程的标记-整理 , 不会产生浮动垃圾,且不会产生内存碎片

两者的不同:

  • 使用范围:CMS仅用于老年代,G1老年代和新生代都有,G1也有分代的概念,但是没区分太开,都是以区域Region代称
  • STW时间:初始标记阶段,因为G1自己有新生代的回收功能,因此在minor gc阶段会触发到初始标记,标记根对象,因此实际上并不会多出处理时间,因此在第一阶段G1更快,并发标记阶段,都差不多,第三阶段也差不多,第四阶段,CMS的垃圾回收线程与用户线程并行,没有STW的时间,因此在此阶段的速度远大于G1,但是G1可以建立出预测时间停顿的模型,规划限制停顿时间,因此两者在STW的时间各有优势,但是延迟上还是CMS占优的
  • 垃圾碎片:CMS采用标记-清理,势必会产生更多的内存碎片,G1采用标记-整理,进行了空间整合,基本不会产生内存碎片
  • 垃圾回收的过程:初始阶段G1协同minor gc 进行,最终阶段,CMS协同用户线程进行,G1会触发STW
  • CMS会产生浮动垃圾:在最终阶段,用户进程还会继续运行,这时产生的垃圾只能到下一次来回收了,但是对内存是有调整的,需要一个浮动垃圾区域来存放。

3.4.1 G1垃圾回收阶段

image-20230318234514924

3.4.2 Young collection

image-20230318234635551

伊甸园满后,会触发,然后伊甸园的幸存对象放到幸存区

image-20230318234718667

伊甸园——》幸存区——》老年区

3.4.3 Young Collection + CM

image-20230318234918180

3.4.4 Mixed Colletion

image-20230319000114564

3.4.5 Full GC

image-20230319134523252

G1和CMS都是并发回收失败,(垃圾回收的速度慢于垃圾产生的速度时),才会触发串行的Full GC

3.4.6 跨代引用

image-20230319134824961

对引用了新生代中的对象的老年代的的GC ROOT进行扫描(脏卡),减少对GC Root的扫描时间

3.4.7 Remark

image-20230319135311452

加了写屏障技术,在白色的对象的引用关系在并发标记时被修改后,会变成灰色加入一个队列,然后在重新标记阶段,从队列中取出,重新标记这个对象(黑色or白色),之后会进行统一的清理。

3.4.8 JDK 8u20 字符串去重

image-20230319141044829

3.4.9 JDK 8u40并发标记类卸载

image-20230319141711444

3.4.10 JDK 8u60回收巨型对象

image-20230319143528690

在无卡表引用时,新生代的minorGC就回收掉

3.4.11 JDK9 并发标记起始时间的调整

image-20230319143743259

4 垃圾回收调优

4.1

 posted on 2023-03-19 14:40    阅读(161)  评论(0编辑  收藏  举报