jvm回收机制

jvm堆分区回收机制

jvm采用分代回收 标记清除机制

jvm分区

大部分的对象生命周期非常短,所以堆内存分为新生代和老年代,

新生代分为Eden区和两个survivor区s0 s1

新生代GC-YGC

新生代内存不足触发ygc,将Eden区的存活对象复制到s0区,

下一ygc 将同时回收Eden和s0区的对象,将存活对象复制到s1区,同时清空Eden和s0

每经过一次ygc,存活的对象年龄+1,达到年龄阈值的对象被复制进老年代中

或者survivor中的内存不足时将有部分对象进入老年代

对象进入老年代中的条件

  1. 大对象直接分配到老年代中

  2. ygc时 survivor中不足以存放对象

  3. ygc时存活对象年龄达到了设定阈值

  4. survivor中相同年龄的对象占到一半,大于此年龄的对象将进入老年代

触发FGC的条件

FGC会同时清理新生代和老年代

  1. 晋升到老年代的对象超过老年代的剩余空间
  2. 老年代的使用率达到了使用阈值
  3. 空间分配担保 ygc 老年代空间不够对象晋升至老年代使用
  4. Metaspace在空间不足是进行扩容如果不足,扩容到阈值触发FGC
  5. 主动调用System.gc()

G1 收集器

相比于cms收集器 ,G1收集器可用同时作用于新生代和老年代,G1堆内存在传统分区的基础上将内存进一步分为多个分区

每次触发gc会优先清理回收价值比较高的分区,可以有效减少gc时间

参考原文 https://mp.weixin.qq.com/s/P8s3kuceBNovUP5adXpFCQ

posted @ 2021-04-04 17:07  culater  阅读(101)  评论(0编辑  收藏  举报