JVM之垃圾回收面试篇

2023-09-26 八股文
1.你知道哪些对象死亡算法?
  1. 引用计数法:每当对象被引用一次就+1,引用结束-1,计数器为0时开始回收;
    • 由于引用计数法无法解决循环引用的问题,因此JVM没有采用
  2. 可达性分析算法:根节点由一系列“GCRoots”组成,层层遍历,没有遍历到的对象代表可回收对象。

可达性分析算法

2.你说引用计数法无法处理循环引用问题,那么什么是循环引用问题?

A引用对象1,B引用对象2,对象1引用对象2,对象2引用对象1;但是对象1和2在堆内,导致计数器始终为1,没法回收。

循环引用

3.哪些对象可以作为GCRoots?
  1. 栈帧:虚拟机栈,即本地变量表的所有对象
  2. 方法区:
  3. 本地方法栈:本地方法栈中(Native方法)引用的对象
4.主流的垃圾收集算法有哪些?

标记-清除算法、复制算法、标记-整理算法(标记-清除-压缩)

  • 扩展:年轻代的From和To区就用于复制算法
5.Java的堆是如何分代的?为什么分代?

年轻代:老年代=1:2,JVM采用的分代收集算法,让年轻代采用复制算法执行效率高,而老年代采用标记清除或标记整理算法

可达性分析算法

6.年轻代的对象何时进入老年代?有没有直接进入老年代的对象?
  1. 大部分对象直接进入Eden区
  2. Eden区满出发YoungGC,清空Eden,进入From
  3. 第二次触发YGC,From区存活的对象进入To区,年龄为2,新进来的年龄为1
  4. 默认年龄到达15的对象,进入老年代
  5. 超大对象直接进入老年代

可达性分析算法

7.YoungGC和FullGC的触发条件是什么?
  • Eden区满出发YoungGC
  • FullGC触发条件
    • 老年代空间不足触发
    • 老年代最大可用连续控件,小于本次年轻代进入的总对象大小
8.什么是Stop The World?

简称STW,执行垃圾收集算法时其他所有线程都被挂起;这是Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互。

2.说一下CMS是如何工作的?有什么特点?
  1. 特点:停顿时间段,不是全程出于STW阶段
  2. 初始标记:STW,标记老年代GCRoots,新生代可直达的老年代
  3. 并发标记:继续向下查找,多线程工作,理论耗时较长但不会阻塞,无STW
上次更新: 4 个月前