文章目录
1 minor gc,major gc ,full gc
jvm 在进行gc时,并非每次都对上面的上内存(新生代,老年代,方法区)区域一起回收,大部分回收的都是指新生代
对于hotspot vm 实现,它里面的gc按照回收区域分为两大类型:一种是部分收集(partial gc),一种是整堆收集(Full Gc)。
部分收集
-
新生代收集(Minor gc / young gc):只是新生代的垃圾收集
-
老年代收集(Major gc / old gc):只是老年代的垃圾收集
-
整堆收集(Full gc):收集整个java堆和方法区的垃圾回收
1.1 年轻代GC(Minor GC) 触发机制
-
当年轻代空间不足时,就会触发Minor Gc,这里的年轻代满指的是 eden 代满,survivor 满 不会引发Gc
-
由于java 对象大多都具备朝生夕死的特性,所以minor gc非常频繁,一般回收速度也比较快
1.2 老年代Gc(major gc) 触发机制
-
指发生在老年代的gc,对象从老年代消失
-
出现major gc,经常会伴随至少一次的minor gc
-
major gc 的速度一般会比 minor gc 慢十倍以上,stw时间更长
-
如果major gc 后内存还不组,就报oom
1.3 Full Gc触发机制
触发full gc 执行的情况有五种
-
调用System.gc()时,系统建议执行Full Gc,但是不必然执行
-
老年代空间不足
-
方法区空间不足
-
通过Minor gc 后进入老年代的平均大小大于老年代的可用内存
-
由eden 区,s0(from)区向s1(to)区复制时,对象大小大于to可用内存是,把对象转存到老年代,且老年代的可用内存小于该对象大小
说明:full gc 是开发或调优中尽量要避免的,这样暂时时间会短一些
2 堆空间分代思想
为什么要把java堆分代?不分代就不能正常工作了吗?
-
由于不同对象的生命周期不同,70%~99%的对象时临时对象
- 新生代:有eden ,s0,s1 构成
- 老年代:存放新生代中经历多次gc仍然存活的对象
不分代也是可以的,分代的唯一理由就是优化gc性能,由于许多对象都是朝生夕死,把新建对象放到某一地方,当gc时先把此对象区域进行回收。