GC的收集器种类:
收集器存在连线的说明他们可以配合使用。
新生代
1.串行GC(serial)垃圾回收器
单线程收集器,必须暂停所有的工作线程直到结束:
最古老,稳定效率高的垃圾回收器
对应的JVM参数是: -XX:+UseSerialGC
开启后会使用:Serial(Young区用) + Serial(Old区用)的收集器组合,表示新生代,老年代都会使用串行的垃圾回收器,
新生代使用复制算法,老年代使用标志-整理算法
参数示例: -Xms10m -Xmx10m -XX:PrintGCDetails -XX:UseSerialGC
2.并行GC(ParNew)收集器
使用多线程进行垃圾回收,在垃圾回收时,会 STW暂停其他所有工作线程直到他结束。
ParNew收集器就是Serial收集器的新生代的并行多线程版本。最常见的是
配合老年代的CMS GC工作。其余行为和Serial行为一样,同样需要暂停所有线程。
开启后:新生代使用并行垃圾回收,老年代使用串行垃圾回收。
JVM参数:-XX:+UseParNewGC
JDK8 的默认垃圾回收器,ParNew+Serial这条线已经不被使用,官方已经说这样不好。
备注: -XX:ParallelGCThreads 限制线程数,默认启动和CPU数目相同的线程数
3.Parallel Scavenge(Parallel GC)
关注:(适用与计算型场景,无需考虑停顿时间,直接开起多个线程)
可控吞吐量 = (运行代码时间/ 运行代码垃圾手机时间)
程序运行100分钟,垃圾收集器1分钟,吞吐量为99%
自适应调节策略:根据当前系统的运行情况收集性能,监控信息,动态调整这些参数提供合适的停顿时间(-XX:MaxGCPauseMillis)和吞吐量
JVM参数:-XX:+UseParallelGC
-XX:ParallelGCThreads = 数字N,N表示启动多少个GC线程
cpu线程数 > 8 N = 5/8
cpu线程数 < 8 N = 实际cpu线程数
老年代垃圾收集器:
SerialOld(单线程老年代)
作用: 作为老年代版本CMS垃圾收集器的 后备收集器
CMS(并发标记清除)
Concurret Mark Sweep:是一种以获取最短回收停顿时间为目标的收集器。
适合应用在互联网或B/S系统的服务器上,这类应用重视服务器的相应速度,希望系统停顿时间最短。
虽然JDk后的G1出现了对停顿时间可控的功能,但是对于小于32G的场景,CMS还是中小型公司的首选。
并发收集低停顿,并发指的是与用户线程一起执行。
CMS必须在老年代堆内存耗尽前,完成GC回收。否则将触发担保机制,使用串行回收,将造成更大的停顿时间。
JVM参数:-XX:+UseConcMarkSweepGC 开启参数,会自动将 -XX:+UserParNewGC打开、
开启参数后:;使用ParNew(Young)+CMS(Old)+SerialOld(CMS出错启用)
初始标记(initial mark): 标记一下GC Roots能直接关联对象,速度很快,需要暂停所有工作线程
并发标记(concurrent mark):