Appearance
1.你知道哪些对象死亡算法?
- 引用计数法:每当对象被引用一次就+1,引用结束-1,计数器为0时开始回收;
- 由于引用计数法无法解决循环引用的问题,因此JVM没有采用
- 可达性分析算法:根节点由一系列“GCRoots”组成,层层遍历,没有遍历到的对象代表可回收对象。
2.你说引用计数法无法处理循环引用问题,那么什么是循环引用问题?
A引用对象1,B引用对象2,对象1引用对象2,对象2引用对象1;但是对象1和2在堆内,导致计数器始终为1,没法回收。
3.哪些对象可以作为GCRoots?
- 栈帧:虚拟机栈,即本地变量表的所有对象
- 方法区:
- 本地方法栈:本地方法栈中(Native方法)引用的对象
4.主流的垃圾收集算法有哪些?
标记-清除算法、复制算法、标记-整理算法(标记-清除-压缩)
- 扩展:年轻代的From和To区就用于复制算法
5.Java的堆是如何分代的?为什么分代?
年轻代:老年代=1:2,JVM采用的分代收集算法,让年轻代采用复制算法执行效率高,而老年代采用标记清除或标记整理算法
6.年轻代的对象何时进入老年代?有没有直接进入老年代的对象?
- 大部分对象直接进入Eden区
- Eden区满出发YoungGC,清空Eden,进入From
- 第二次触发YGC,From区存活的对象进入To区,年龄为2,新进来的年龄为1
- 默认年龄到达15的对象,进入老年代
- 超大对象直接进入老年代
7.YoungGC和FullGC的触发条件是什么?
- Eden区满出发YoungGC
- FullGC触发条件
- 老年代空间不足触发
- 老年代最大可用连续控件,小于本次年轻代进入的总对象大小
8.什么是Stop The World?
简称STW,执行垃圾收集算法时其他所有线程都被挂起;这是Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互。
2.说一下CMS是如何工作的?有什么特点?
- 特点:停顿时间段,不是全程出于STW阶段
- 初始标记:STW,标记老年代GCRoots,新生代可直达的老年代
- 并发标记:继续向下查找,多线程工作,理论耗时较长但不会阻塞,无STW