分类
STW
Stop-The-World: 是在垃圾回收算法执?(判断哪些是垃圾)过程当中,将JVM内存冻结、(用户线程暂停)应用程序停顿的?种状态。
减少GC就是减少了STW的时间和频率,减少对用户线程的干预。调优就是希望GC的情况少一些。
JVM进行GC的时候,并非每次都对新生代、老年代、方法区三个内存区域一起回收,大部分回收的都是指新生代。
针对HotSpot虚拟机的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)
部分收集(Partial GC)
不是完整收集整个Java堆的垃圾收集。其中又分为
?Minior GC/Yong GC
新生代收集:只是新生代(Eden\S0,S1)的垃圾收集
?Major GC/Old GC
老年代收集:只是老年代的垃圾收集。
目前只有CMS GC会有单独收集老年代的行为。
注意,很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。
Mixed GC
混合收集:收集整个新生代以及部分老年代的垃圾收集。
目前只有G1 GC会有这种行为
整堆收集(Full GC)
收集整个java堆和方法区的垃圾收集。
GC策略的触发条件
年轻代GC(Minior GC)触发机制
当年轻代空间不足时,就会触发Minor GC,这里的年轻代是指伊甸园区满,幸存者区满不会引发GC。(每次 Minor GC 会清理年轻代的内存。)
- 幸存者区的GC是被动的,触发的条件是伊甸园区满了。
- 因为Java对象大多具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。
- Minior GC会引发STW,暂停其他用户线程,等待垃圾回收技术,用户线程才会恢复执行。
老年代GC(Major GC)触发机制
当对象从老年代消失时,Major GC就发生了。
- 当老年代空间不足时,会尝试先触发Minor GC。如果之后空间还不足,则触发Major GC。(并非绝对,在Parallel Scavenge并行垃圾回收器的收集策略里就直接进行Major GC的策略选择过程没有执行Minor GC)。
- MajorGC的速度一般会比Minor GC慢10倍以上,STW的时间更长(因为老年代的空间通常比新生代大)。
- 如果Major GC后,内存还不足就报OOM。
整堆收集(Full GC)触发机制
Full GC的执行情况有如下5种:
(1)强制调用System.gc()
时
(2)老年代空间不足
(3)方法区空间不足
(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
(5)由伊甸园区(Eden)、幸存者0(S0)区像幸存者1区(S1)复制时,对象大小大于幸存者1区可用内存,则把该对象转存老年代,且老年代的可用内存小于该对象大小(老年代存不下)
FUll GC是开发或调优中应尽量避免的。这样暂停(STW)时间会短一些。
方法区的回收主要回收类和类加载器。