前言:
近在好多朋友应该都在备战面试,收集到很多反馈,整理一下面试题。发现今年有些题目的出现频率真的是太高了,网上也有很多这样的总结。感觉还是很乱,就花了点时间把重要的东西总结了一下。
Jvm垃圾回收器
答:垃圾回收器可以在新生代和老年代都有,在新生代有Serial、ParNew、Parallel Scavenge;老年代有CMS、Serial Old、Parallel Old;还有不区分年的G1算法。
追问1:CMS垃圾回收器的过程是什么样的?会带来什么问题?
答:CMS回收过程可以分为4个步骤。
(1)初试标记:初试标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,但需要暂停所有其他的工作线程。
(2)并发标记:GC 和用户线程一起工作,执行GC Roots跟踪标记过程,不需要暂停工作线程。
(3)重新标记:在并发标记过程中用户线程继续运作,导致在垃圾回收过程中部分对象的状态发生了变化,未来确保这部分对象的状态的正确性,需要对其重新标记并暂停工作线程。
(4)并发清除:清理删除掉标记阶段判断的已经死亡的对象,这个过程用户线程和垃圾回收线程同时发生。
带来的问题:
(1)CMS收集器对处理器资源非常敏感。
(2)CMS无法处理“浮动垃圾”。
(3)CMS是基于标记-清除算***产生大量的空间碎片。
追问2:G1垃圾回收器的改进是什么?相比于CMS突出的地方是什么?
答:G1垃圾回收器抛弃了分代的概念,将堆内存划分为大小固定的几个独立区域,并维护一个优先级列表,在垃圾回收过程中根据系统允许的最长垃圾回收时间,优先回收垃圾最多的区域。(G1算法是可控STW的一种算法,GC收集器和我们GC调优的目标就是尽可能的减少STW的时间和次数。)
G1突出的地方:
基于标记整理算法,不产生垃圾碎片。
可以精确的控制停顿时间,在不牺牲吞吐量的前提下实现短停顿垃圾回收。
追问3:现在jdk默认使用的是哪种垃圾回收器?
回答:(被问到过好几次)
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8