分析&回答
一、Serial收集器(新生代、复制算法)
这是一个单线程工作的收集器,这个单线程并不是只用一条线程完成垃圾回收的操作,而是在进行垃圾回收的时候,必须停掉其他所有的工作线程,直到它收集结束。
二、ParNew收集器(新生代、复制算法)
ParNew收集器实质上是Serial收集器的多线程并行版本,可以同时采用多条线程进行垃圾处理。
三、Parallel Scavenge收集器(新生代、复制算法)
Parallel Scavenge收集器是一款新生代收集器,基于标记复制算法,能够并行收集。特点是其关注点和其他收集器不一样,它的目标是达到一个可控的吞吐量,而不是向CMS等收集器一样尽可能的缩短垃圾收集的时候用户线程的停止时间。
四、Serial Old收集器(老年代、整理算法)
Serial Old收集器是Serial收集器的老年代版本,同样是一个单线程的收集器,使用标记-整理算法,有俩种用途:一是在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用;二是作为CMS收集器失败之后的后预案。
五、Parallel Old收集器(老年代、整理算法)
Parallel Old是Parallel Scavenge的老年代版本,支持并发收集,基于标记-整理算法实现。在注重吞吐量或者处理器资源较为稀缺的场合,优先选取Paralle Scavenge + Parallel Old的搭配方式。
六、CMS收集器(Concurrent Mark Sweep)
CMS收集器是一种以获取最短停顿时间为目标的垃圾收集器。从名字上就可以看出CMS收集器是基于标记-清除法的垃圾收集器,运作过程要相对来说复杂一些,整个过程分为四个阶段:
- 初始标记:标记GC Roots能直接关联到的对象,速度很快,需要暂停用户线程;
- 并发标记:是指从GC Roots的关联对象开始遍历整个对象图的过程,耗时比较长但是不要需要暂停用户线程;
- 重新标记:修正在并发标记期间,因用户线程继续运作导致标记产生变动的那一部分对象的标记记录,需要暂停用户线程,但是时间相对并发标记阶段还是很短的;
- 并发清除:清理掉标记阶段已经死亡的对象,由于使用清除算法,不需要移动对象,因此不需要暂停用户线程,并发清除;
总的来说,CMS收集器的内存回收是和用户线程是一起并发执行的。
CMS垃圾回收器主要有如下三个缺点:
- CMS收集器对处理器资源非常敏感。CMS的默认回收线程数是(处理器核心数+3)/4,CPU的核心数越少,CMS回收对用户线程的影响就越大。
- CMS收集器无法回收浮动垃圾,有可能出现一次并发清除失败而导致暂停用户线程进行Full GC。在CMS的并发清理阶段,用户线程还是在运行的,程序在结束以后会有新的垃圾产生,但是这部分垃圾CMS无法在当此清除他们,只能在下一次再次清除,这部分垃圾就叫浮动垃圾。在进行垃圾清理的过程中,由于用户线程还在运行中,因此需要留下一块空间供用户线程使用。当CMS运行期间预留的内存无法满足用户线程新建对象的需要,就会出现并发清除失败,进而使用Serial Old收集器来暂停用户线程收集老年代的垃圾。
- CMS是基于标记清除算法的垃圾回收器,那么就会产生内存碎片,这样分配大对象就会遇到麻烦,不得不提前触发一次Full GC。
七、G1回收器(Garbage First)
G1回收器是一款主要面向服务端应用的垃圾回收器,JDK9之后,它替代了Parallel回收器。G1回收器可以面向堆内存中的任意地方来回收内存(Mix GC),没有被局限在新生代、老年代、和整堆回收中。
G1回收器中的基于Region的堆内存布局是实现上述目标的关键。G1将Java堆分为多个大小相等的独立区域(Region),每个Region都可以根据需要扮演新生代的Eden空间、Survivior空间以及老年代空间。Region中还有一个特殊的Humongos区域,用于存储大对象,当大对象的大小超过单个Region的时候,这个对象会被放在多个连续的Humongos Region中,G1会把这个区域当作老年代来处理。
G1收集器的新生代和老年代并不是固定的,他们都是一系列区域(不需要连续)的动态集合,G1进行垃圾回收的时候Region是垃圾回收的最小单元,每次收集的内存空间是G1的整数倍,有限回收收益最大的区域,能够让G1收集器在有限的时间内获取尽可能高的手机效率。
G1收集的过程大致分为以下四个步骤:
- 初始标记:标记GC Roots能直接关联到的对象,并且修改TAMS指针的值,让下一阶段的用户线程并发工作的时候能正确的在可用Region中分配新对象,此阶段需要停止用户线程,但是时间短,而且是在Minor GC中同步完成的。
- 并发标记:从GC Roots开始对堆中的对象进行可达性分析,扫描整个堆,耗时较长,但是和用户进程是并发进行的;
- 最终标记:对用户线程做另一个短暂的暂停,用户处理并发阶段结束后遗留的少量的STAB记录;
- 筛选回收:对各个Region的回收价值和成本进行排序,根据用户期望的停顿时间来制定停顿计划,把回收的那部分Region中存活的对象复制到空的Region中,再清理掉旧的Region中的全部空间,涉及对象的复制移动,需要暂停用户线程
G1在整体上是基于标记整理算法实现的,但是从俩个Region来看,是基于标记复制算法,这俩种方法确保G1在垃圾回收的时候不会产生内存碎片。
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!