jvm回收机制
jvm堆分区回收机制
jvm采用分代回收 标记清除机制
jvm分区
大部分的对象生命周期非常短,所以堆内存分为新生代和老年代,
新生代分为Eden区和两个survivor区s0 s1
新生代GC-YGC
新生代内存不足触发ygc,将Eden区的存活对象复制到s0区,
下一ygc 将同时回收Eden和s0区的对象,将存活对象复制到s1区,同时清空Eden和s0
每经过一次ygc,存活的对象年龄+1,达到年龄阈值的对象被复制进老年代中
或者survivor中的内存不足时将有部分对象进入老年代
对象进入老年代中的条件
-
大对象直接分配到老年代中
-
ygc时 survivor中不足以存放对象
-
ygc时存活对象年龄达到了设定阈值
-
survivor中相同年龄的对象占到一半,大于此年龄的对象将进入老年代
触发FGC的条件
FGC会同时清理新生代和老年代
- 晋升到老年代的对象超过老年代的剩余空间
- 老年代的使用率达到了使用阈值
- 空间分配担保 ygc 老年代空间不够对象晋升至老年代使用
- Metaspace在空间不足是进行扩容如果不足,扩容到阈值触发FGC
- 主动调用System.gc()
G1 收集器
相比于cms收集器 ,G1收集器可用同时作用于新生代和老年代,G1堆内存在传统分区的基础上将内存进一步分为多个分区
每次触发gc会优先清理回收价值比较高的分区,可以有效减少gc时间