JVM —— GC流程

  • Post author:
  • Post category:其他


新创建的对象一般都会被分配在新生代的 Eden 中,当某一时刻,创建的对象将 Eden 区全部挤满了,就会触发一次 Minor GC

在 Minor GC 之前,虚拟机会先检测老年代是否有足够的空间存放新生代中的对象,确保 Survivor 中放不下对象时这些对象可以进入老年代

  • 老年代剩余空间大于新生代中对象的大小:直接 Minor GC,如果 Minor GC 后 survivor 放不下,老年代也绝对放得下
  • 老年代剩余空间小于新生代中的对象大小:查看是否启用了「

    老年代空间分配担保规则

    」,具体来说就是看

    -XX:-HandlePromotionFailure

    参数是否设置了(一般都会设置);如果没有开启分配担保,则直接进行 Full GC

对于分配担保规则:

  • 老年代中剩余空间大于历次 Minor GC 之后剩余对象的大小,进行 Minor GC
  • 老年代中剩余空间小于历次 Minor GC 之后剩余对象的大小,进行 Full GC

在 Minor GC 时,将 Eden 与 From 中的对象进行一次垃圾回收,并把存活的对象复制到 To 中,年龄加一,然后交换 From 和 To 的身份,始终保持 From 和 To 中有一个区域是空的

如果在 Minor GC 后,Survivor 有足够空间存放对象,GC 结束,否则对象将进入老年代,如果老年代也放不下,就会进行 Full GC

如果在进行 Full GC 后,还是没有空间存储对象,则抛异常


对象晋级

:当经过多次 轻GC 后,如果有对象的年龄达到了 15,则将对象转移到老年区中

晋级的年龄对于不同的收集器,值不同,有些收集器会根据 From 中的内存占用率来动态改变晋级年龄

按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了 survivor 区的一半时,取这个年龄和 MaxTenuringThreshold 中更小的一个值,作为新的晋升年龄阈值 age:min(age, MaxTenuringThreshold)



版权声明:本文为qinuna原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。