参考答案
垃圾分代分为新生代和老年代。新生代默认占总空间的 1/3,老年代默认占 2/3。
新生代使用复制算法,有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1。
当新生代中的 Eden 区内存不足时,就会触发 Minor GC。
具体过程如下:
1. 在 Eden 区执行了第一次 GC 之后,存活的对象会被移动到其中一个 Survivor 分区。
2. Eden 区再次 GC,这时会采用复制算法,将 Eden 和 from 区一起清理,存活的对象会被复制到 to 区。
3. 移动一次,对象年龄加 1,对象年龄大于一定阀值会直接移动到老年代。
4. Survivor 区相同年龄所有对象大小的总和 > (Survivor 区内存大小 * 这个目标使用率)时,大于或等于该年龄的对象直接进入老年代。其中这个使用率通过 -XX:TargetSurvivorRatio 指定,默认为 50%。
5. Survivor 区内存不足会发生担保分配。
6. 超过指定大小的对象可以直接进入老年代。
7. Major GC,指的是老年代的垃圾清理,但并未找到明确说明何时在进行Major GC。
8. FullGC,整个堆的垃圾收集,触发条件:
- 每次晋升到老年代的对象平均大小 > 老年代剩余空间。
- MinorGC后存活的对象超过了老年代剩余空间。
- 元空间不足。
- System.gc() 可能会引起。
- CMS GC异常,promotion failed:MinorGC时,survivor空间放不下,对象只能放入老年代,而老年代也放不下造成;concurrent mode failure:GC时,同时有对象要放入老年代,而老年代空间不足造成。
- 堆内存分配很大的对象。
以上,是JVM面试题【垃圾分代收集的过程是怎样的】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—