【JVM专题】垃圾回收器常见问题
本问题对应的项目链接:高频题回答模版训练
PS:这块主要靠背了,一般就考察G1和CMS,特别容易忘,大家需要多看几遍
1、常用的垃圾回收器有哪些?(直接给出答案就行,等提问具体的回收器)
2、CMS垃圾回收器介绍一下
3、G1回收器了解吗?介绍一下
4、G1和CMS有啥区别?
5、STW了解吗?CMS什么时候会STW?为什么要ST W?
6、说一下垃圾回收?如果GC突然很慢怎么排查,比如原来GC完成只需要1秒,现在要5秒?
本问题对应的项目链接:高频题回答模版训练
PS:这块主要靠背了,一般就考察G1和CMS,特别容易忘,大家需要多看几遍
1、常用的垃圾回收器有哪些?(直接给出答案就行,等提问具体的回收器)
2、CMS垃圾回收器介绍一下
3、G1回收器了解吗?介绍一下
4、G1和CMS有啥区别?
5、STW了解吗?CMS什么时候会STW?为什么要ST W?
6、说一下垃圾回收?如果GC突然很慢怎么排查,比如原来GC完成只需要1秒,现在要5秒?
共以下 3 个回答
4、G1和CMS有啥区别?
首先是 G1 回收器的内存结构完全区别于 CMS。G1 整体上是基于 ”标记-整理“ 算法的实现,不会出现内存碎片,而 CMS 本质上是基于 ”标记-清除“ 算法实现,会有内存碎片问题。除此之外,G1 回收器可以根据自定义停顿时间模型,来决定本次回收多少 Region。
****6、说一下垃圾回收?如果GC突然很慢怎么排查,比如原来GC完成只需要1秒,现在要5秒?
1、常用的垃圾回收器有哪些?(直接给出答案就行,等提问具体的回收器)
常用的垃圾回收器有 CMS,G1,还有比较早的 Serial,Serial Old,Parallel New,Parallel Old 等等。
2、CMS垃圾回收器介绍一下
CMS 在 JDK 8 是比较新的垃圾回收器,它最大的特点是并发,也就是能尽量减少 STW 的时间,在某些场景下让用户线程和 GC 线程并发执行。
CMS 的工作流程简单来说分为五个步骤:初始标记,并发标记,并发预清理,重新标记以及并发清除。
初始标记会标记 GC Roots 直接关联的对象,这个过程会发生短暂的 STW。初始标记完之后会进入并发标记,在这个过程中不会发生 STW,用户线程与 GC 线程可以同时工作,这个阶段主要是从 GC Roots 向下追溯,标记所有可达的对象。之后会进入并发预处理阶段,这个阶段主要目标是减少下一个会发生 STW 的阶段的执行时间,通过扫描卡表或者遍历新生代来确认在并发标记中发生改变的对象。接着就是重新标记,这个阶段 STW 停顿的时间主要取决于上个阶段,接着标记还存活的老年代对象。最后就是并发清除阶段,这个阶段不会 STW,用户线程一遍执行,GC 线程一边回收刚标记过的垃圾。
不过 CMS 也有缺点,主要是存在内存碎片问题,因为它本质上还是按照 ”标记-清除“ 算法 去实现的。如果内存碎片太多的话会触发 Full GC,CMS 一般在 Full GC 这个过程中对碎片进行整理。整理的过程又包括 ”移动“,”标记“,也是会发生 STW 的;还有就是 CMS 回收过程中会产生浮动垃圾,主要是在并发清除阶段,由于 GC 的过程中用户线程也一直在执行,那就会一直产生垃圾,这些垃圾只能到下一次 GC 时才能清理。
3、G1回收器了解吗?介绍一下
使用 G1 回收器时,JVM 堆的划分不再是物理的形式,而是以逻辑的形式将整个堆划分成多个小的 Region,这样在垃圾回收时能比较容易的控制垃圾回收的时间,减少 STW。
G1 垃圾回收的过程主要分为 Minor GC 和 Mixed GC,某些特殊的场景会发生 Full GC。 对于 Minor GC 来说也是灯 Eden 区满了就触发 Minor GC。当整个堆空间的占用率到达一定阈值时才会触发 Mixed GC。
Minor GC 的过程可以简单分为三个步骤:根扫描,更新和处理 RSet,复制对象。根扫描的过程就和 CMS 的初始标记过程差不多,扫描与 GC Roots 直接关联的对象。第二步就是更新和处理 RSet,将老年代对象持有年轻代对象的引用都加入到 GC Roots 下,避免被回收。最后是复制对象,把扫描之后存活的对象往 ”空的 Survivor 区“ 或 ”老年代“ 存放,其它的 Eden 区清除。
Mixed GC 是一个混合的 GC,它不仅会回收年轻代,触发 Minor GC,也会回收部分老年代的 Region。回收过程大概是初始标记,并发标记,重新标记,清理。
首先初始标记的过程复用了 Minor GC 扫描 GC Roots 的操作,速度很快。然后进行并发标记,GC 线程与用户线程一起执行,GC 线程负责收集各个 Region 的存活对象信息,从 GC Roots 往下追随,查找整个堆存活的对象。然后是重新标记,用 STAB 算法标记那些在并发标记阶段发生变化的对象,带有 STW。最后是清理,这个阶段也会发生 STW,主要回收所有的年轻代 Region,部分回收价值高的老年代 Region。
某些情况下,如果 Mixed GC 中回收速度跟不上用户线程分配内存的速度,导致老年代填满无法继续进行 Mixed GC,就会降级到 Serial Old GC 对整个堆进行 GC。
4、G1和CMS有啥区别?
首先是 G1 回收器的内存结构完全区别于 CMS。G1 整体上是基于 ”标记-整理“ 算法的实现,不会出现内存碎片,而 CMS 本质上是基于 ”标记-清除“ 算法实现,会有内存碎片问题。除此之外,G1 回收器可以根据自定义停顿时间模型,来决定本次回收多少 Region。
5、STW了解吗?CMS什么时候会STW?为什么要STW?
STW 就是 Stop the World,在垃圾回收时除 GC 线程外,其它线程都要停止工作,导致应用暂时停止访问。
CMS 会在初始标记和重新标记阶段发生 STW,在初始阶段会标记与 GC Roots 相关的对象,这时是需要用户线程停止工作的。之后在重新标记阶段也一样,需要标记还存活着的老年代对象,这个过程也要 STW。
6、说一下垃圾回收?如果GC突然很慢怎么排查,比如原来GC完成只需要1秒,现在要5秒?
(不完善,遇到了再补充)
出现这种情况可以先去看下 GC 日志,看是哪个环节的时间很长,比如 root scraning,object copy 啥的。最好是用 gceasy 工具使 GC 日志可视化看看堆信息,交互式图表等等。
除此之外还可以 dump 线程进行分析。