垃圾分代收集的过程是怎样的

参考答案

垃圾分代分为新生代老年代。新生代默认占总空间的 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—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧