JVM垃圾收集器
串行收集器
1.最古老的收集器
2.当进行垃圾回收的时候,回收线程是串行执行的,时间久,可能会产生较长停顿
3.-XX:+UseSerialGC
新生代、老年代使用串行回收
新生代复制算法
老年代标记-压缩
并行收集器
a.ParNew
1.新生代并行,老年代串行
2.是串行收集器新生代的并行版本
3.采用复制算法
4.多线程,需要多核支持
5.-XX:+UseParNewGC
6.-XX:ParallelGCThreads 限制线程数量
b.Parallel
1.类似ParNew
2.新生代赋值算法,老年代标记-压缩算法
3.-XX:+UseParallelGC 使用Parallel收集器+ 老年代串行
4.-XX:+UseParallelOldGC 使用Parallel收集器+ 并行老年代
调优参数:
-XX:MaxGCPauseMills 最大停顿时间,单位毫秒 GC尽力保证回收时间不超过设定值
-XX:GCTimeRatio 0-100的取值范围,垃圾收集时间占总时间的比,默认99,即最大允许1%时间做GC
这两个参数是矛盾的。因为停顿时间和吞吐量不可能同时调优
CMS收集器
1.Concurrent Mark Sweep 并发标记清除
2.标记-清除算法(由于是并发执行的,所以不能使用标记压缩算法,否则程序寻址会懵逼)
3.并发阶段会降低吞吐量,且由于是和用户线程一起运行,所以难免会清理不彻底
4.老年代收集器(新生代使用ParNew)
5.-XX:+UseConcMarkSweepGC
6.CMS运行过程比较复杂,着重实现了标记的过程,可分为
a.初始标记
根可以直接关联到的对象,速度快
b.并发标记(和用户线程一起)
主要标记过程,标记全部对象
c.重新标记
由于并发标记时,用户线程依然运行,因此在正式清理前,再做修正
d.并发清除(和用户线程一起)
基于标记结果,直接清理对象