程序员社区

(JVM面试题) 说一下垃圾分代收集的过程

分为新生代和老年代,新生代默认占总空间的 1/3,老年代默认占 2/3。
新生代使用复制算法,有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1。
当新生代中的 Eden 区内存不足时,就会触发 Minor GC,过程如下:

  • 在 Eden 区执行了第一次 GC 之后,存活的对象会被移动到其中一个 Survivor 分区;
  • Eden 区再次 GC,这时会采用复制算法,将 Eden 和 from 区一起清理,存活的对象会被复制到 to 区;
  • 移动一次,对象年龄加 1,对象年龄大于一定阀值会直接移动到老年代
  • Survivor 区相同年龄所有对象大小的总和 > (Survivor 区内存大小 * 这个目标使用率)时,大于或等于该年龄的对象直接进入老年代。其中这个使用率通过 -XX:TargetSurvivorRatio 指定,默认为 50%
  • Survivor 区内存不足会发生担保分配
  • 超过指定大小的对象可以直接进入老年代
  • Major GC,指的是老年代的垃圾清理,但并未找到明确说明何时在进行Major GC
  • FullGC,整个堆的垃圾收集,触发条件:
    1.每次晋升到老年代的对象平均大小>老年代剩余空间
    2.MinorGC后存活的对象超过了老年代剩余空间
    3.元空间不足
    4.System.gc() 可能会引起
    5.CMS GC异常,promotion failed:MinorGC时,survivor空间放不下,对象只能放入老年代,而老年代也放不下造成;concurrent mode failure:GC时,同时有对象要放入老年代,而老年代空间不足造成
    6.堆内存分配很大的对象

Java面试题

赞(0) 打赏
未经允许不得转载:IDEA激活码 » (JVM面试题) 说一下垃圾分代收集的过程

一个分享Java & Python知识的社区