Young GC / Minor GC
young GC过程
几乎所有对象都在eden区域出生,当eden区域满了之后会进行YoungGC,将留下来的对象复制到to中存放,年龄+1,将Eden区域和survivor中from区域死掉的对象进行回收,再交换from和to。
Minor GC 特点
1. 触发机制:当新生代空间不足时,就会出发Minor GC,这里的新生代满指的是Eden区域满,survivor满了不会触发(每次Minor GC 会清理新生代的内存)
2. Minor GC 非常频繁,一般回收速度也比较快。
3. Minor GC 会引发 STW,暂停其它用户线程,等垃圾回收结束,用户线程才恢复运行
Major GC、 Full GC
Major GC / Old GC:只是老年代的垃圾收集,Full GC:整堆收集
1. 很多时候Major GC 会和Full GC混淆,需要具体分辨是老年代回收还是整堆回收。目前只有CMS GC会单独收集老年代的行为。
2. 目前只有G1 GC 会混合收集,即收集整个新生代以及部分老年代的垃圾收集。
Major / Full GC的特点:
1. 出现 Full GC 经常会伴随至少一次的Minor GC,但非绝对(在Parallel Scavenge收集器的收集策略中就有直接进行Full GC的策略)
2. 在老年代空间不足的时候会先尝试触发Minor GC。如果之后空间还不足,则出发Full GC
3. Full GC的速度一般会比Minor GC 慢很多,STW时间更长
4. 如果Full GC 后,内存还不足就会OOM
触发机制
1. 调用System.gc()时,系统建议执行Full GC,但不是必然执行
2. 老年代空间不足
3. 方法区空间不足
4. 由Ede区、from区向to中复制的时候,对象大小大于to的可用内存,则把该对象转存到老年代,且老年代的可用内存大小小于该对象大小