- 串行收集器Serial: Serial、Serial Old.
- 并行收集器Parallel: Parallel Scavenge、Parallel Old,主要优势吞吐量大
- 并发收集器Concurrent: CMS、G1,主要优势停顿时间短
- 停顿时间: 垃圾收集器做垃圾回收中断应用执行的时间。可以通过参数: -XX:MaxGCPauseMillis来设置
- 吞吐量: 花在垃圾收集的时间和花在应用时间的占比。可以通过参数: -XX:GCTimeRatio=<n>, 垃圾收集时间占: 1/1+n
理想的情况: 在吞吐量最大的时候,停顿的时间最小
串行收集器
单线程的操作,当我们内存不足的时候,就会起一个专门回收的线程进行回收,然后会暂停应用,进行垃圾回收,回收完成,再取消暂停,应用继续运行。简单粗暴,清除彻底。
- -XX:+UseSerialGC(使用这个的时候,默认开启了Old区的GC方式也是SerialGC相当于使用参数-XX:UseSerialOldGC)
并行收集器
并行(Parallel): 指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。适合科学计算、后台处理等弱交互场景。
- 吞吐量有限
- -XX:+UseParallelGC(使用这个的时候,默认开启了Old区的GC方式也是ParallelGC相当于使用参数-XX:+UseParallelOldGC)
- Server模式下的默认收集器
并发收集器
并发(Concurrent): 指用户线程与垃圾收集线程同时执行(但不一定是并行的, 可能会交替执行),垃圾收集线程在执行的时候不会停顿用户程序的运行。适合对响应时间有要求的场景,比如一些web应用。
- 响应时间优先
- CMS: -XX:+UseConcMarkSweepGC(设置CMS的时候,Young区默认是使用并发的方式进行回收,相当于参数: -XX:+UseParNewGC)
- G1: -XX:UseG1GC
各个年代垃圾收集器的分布图

如何选择垃圾收集器
- 优先调整堆的大小让服务器自己来选择
- 如果内存小于100M,使用串行收集器
- 如果是单核,并没有停顿时间的要求,串行或者JVM自己选择
- 如果允许停顿时间超过1秒,选择并行或者JVM自己选择
- 如果响应时间最重要,并且不能超过1秒,使用并发收集器
官方文档: 如何选择垃圾收集器
官方文档: GC调优指南
网友评论