2026-03-08 11:10:54
秋招JVM面试真题答案:
一、头条一面:JVM从GC角度看,堆的分区情况 堆的分区:从GC角度,Java堆可分为老年代和新生代。新生代进一步细分为Eden区和两个Survivor区。 分区原因:大部分Java对象生命周期很短,为了提高性能,将新生成的对象放在Eden区,经过多次GC仍存活的对象则放入老年代。 新生代细分原因:Eden区对象寿命短,频繁GC会影响性能。设立Survivor区作为缓冲,存放“年纪不够老”的对象,减少Full GC的发生,提高垃圾回收性能。 Survivor区垃圾回收:Survivor区会进行垃圾回收,但通常是随Eden区的GC顺带进行。Eden区和两个Survivor区的默认比例是8:1:1。 两个Survivor区的好处:采用复制算法,保证存活对象占用连续内存空间,避免碎片化。
二、美团一面:JVM的垃圾回收算法 可达性分析算法:以GC Roots为起点,搜索被连接的目标对象是否可达,用于判断对象是否存活。 标记清除算法:标记存活对象,清除未标记对象。缺点是会产生内存碎片。 复制算法:将内存分为两块,每次只使用一块,GC时将存活对象复制到另一块,然后清空当前块。优点是无碎片,缺点是需要额外内存。 标记整理算法:标记存活对象后,将所有存活对象压缩到内存一端,清理边界外空间。优点是消除碎片,缺点是效率较低。 分代收集算法:根据对象生命周期不同,将堆分为新生代和老年代,采用不同算法提高回收效率。 增量收集算法:垃圾收集线程和应用程序线程交替执行,减少系统停顿时间,但总体成本上升,吞吐量下降。 分区算法:将堆空间划分成不同小区间,独立使用、独立回收,可控制回收范围。
三、滴滴一面:垃圾回收器及其优缺点 新生代收集器 Serial:单线程收集器,采用复制算法。GC时所有用户线程暂停。 ParNew:Serial的多线程版本,默认开启线程数与CPU数量一致,可通过参数设置线程数。 ParallelScavenge:多线程收集器,目标是达到可控吞吐量,而非最短停顿时间。 老年代收集器 SerialOld:Serial的老年代版本,单线程收集器,采用标记整理算法。 ParallelOld:ParallelScavenge的老年代版本,多线程收集器,采用标记整理算法,可与ParallelScavenge搭配使用。 CMS:以最短回收停顿时间为目标,分为初始标记、并发标记、重新标记和并发清除四个阶段。