jvm面试题(三)

参考《深入理解JVM》这本书,总结一下面试中常备问到的问题


10.OopMap、安全点、安全区域、抢先式中断、主动中断

OopMap:一组特定的数据结构,记录数据引用(用来判断哪些对象是存活的)

安全点:在特定位置生成OopMap,这些位置成为安全点,只有在安全点才能暂停进行GC

安全区域:一段代码中引用关系不会变化,这一段代码称为安全区域(扩展的安全点)

抢先式中断:GC是所有线程都中断、把不在安全点上的线程重新启动跑到安全点上。

主动式中断:多线程去轮询一个标志位,当发现标志位为真时则自动挂起(标志位为真的位置应该与安全点位置重合)


11.垃圾收集器
Serial:新生代复制算法(单线程)STW,老年代标记整理。STW


ParNew:新生代复制算法(多线程)STW,老年代标记整理。STW


Parrallel Scavenge:新生代收集器,专注于吞吐量 
吞吐量 = 运行用户代码时间/(运行用户代码时间 P+ GC时间)


CMS(Concurrent Mark Sweep)收集器:以获取最短回收时间为目标的收集器。
分为四个步骤
1.初始标记:STW 很快,用来标记GC Roots能直接关联到的对象
2.并发标记:并行
3.重新标记:并行,修正并发标记中产生变动的对象记录
4.并发清理
CMS对CPU资源敏感、无法处理浮动垃圾、用标记清除实现有内存碎片


G1(Garbage-First)
整体看来采用标记整理,局部看来(Region之间)采用复制算法。G1将整个java堆分成许多Region,跟踪各个Region里垃圾的回收价值大小,优先回收价值大的Region.
步骤:初始标记、并发标记、最终标记、筛选回收。除了最后一步都和CMS差不多


12.自动化内存分配是怎么分配的
对象主要分配在新生代的Eden区(新生代)上,如果启用了TLAB(本地线程分配缓冲)就分配在TLAB上,大对象(比如很长的数组)直接进入老年代,长期存活的对象进入老年代(参考对象头中的年代值)
动态对象年龄判定(如果在survivor空间中相同年龄所有对象的大小总和大于等于survivor空间的一半,则年龄大于或等于该年龄的对象直接进入老年代)


13.空间分配担保

在Minor GC之前,jvm会检查老年代最大可用连续空间是否大于新生代所有对象的空间。如果成立,则Minor GC是安全的。否则1.jvm设置不允许担保失败则立刻Full GC 2. jvm设置允许担保失败则检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于则进行一次冒险的Minor GC 否则Full GC

PS: Full GC 其实是为了让老年代腾出更多空间



你可能感兴趣的:(jvm)