JVM(四)垃圾收集器_分代收集器
次收集scavenge GC
原理:当Eden区不足已为对象分配内存空间时,会触发scavenge GC,收集器清除非存活的对象,把存活对象放在survivor区,再去整理两个survivor区。
特点:使用频繁,速度快
全收集:Full GC/Major GC
原理:当老年带堆内存不足或调用System.gc时会触发全收集。全收集根据堆内存大小来确定执行时间
注:minor GC会把对象从新生代引入到老年带,在执行全收集之前,最少会执行一次minor GC。全收集执行GC时,速度一般比minor GC慢十倍。
分代收集器分类
有如下几种
#serial:
概念:新生代收集器,jdk1.3以前使用,串行的收集器。hotspot运行在client端次收集器中默认的收集器
特点:单线程运行、做GC时,需要停止所有的线程。
如下图所示:
#parNew
概念:新生代收集器,是serial的多线程版本,配置基本和serial一样。故在多核cpu下,性能比serial高
注:单核cpu下,效率比serial还低。安全点的时间也缩短了。
如下图所示:
#parallel Scavenge
概念:为提高吞吐而产生,属于新生代的收集器
吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 )
参数:
MAXGcPauseMillis:GC收集完了之后的暂停毫秒数
GcTimeRatio: 垃圾收集器的占比
UseAdaptiveSizePolicy:GC自动调节策略,无需再指定上面的两个参数
#serval old
概念:老年代收集器,和serval 差不多,能和每个年轻代的收集器搭配使用
#Paralled old
概念:和parallel Scavenge差不多,只能和parallel Scavenge搭配使用
#CMS(重要)
概念:老年代的收集器,为减少安全点时间为目标的收集器,用户线程和GC线程能一起执行。只能和ParNew配合
#G1
概念:面向服务端的收集器,jdk1.7开始使用,不是默认收集器。
特点:可以运用在年轻代和老年代
注:
GC并行:GC线程
GC并发:用户线程和GC线程能一起执行