概述
串行收集器Serial:Serial、Serial Old,
单线程收集器,jvm分配内存时,发现内存不过用,暂停应用程序,启动一个专门的垃圾回收线程来回收垃圾,回收完成后,继续执行应用程序,应用在内存比较小的嵌入式设备中
并行收集器Parallel:Parallel Scavenge、parallel Old,吞吐量,
吞吐量优先的收集器
并发收集器Concurrent:CMS、G1,停顿时间,
停顿时间优先的收集器
并行VS并发
并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。适合科学计算、后台处理等弱交互场景
并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),拉结收集线程在执行的时候不会停顿用户程序的执行。适合对响应时间有要求的场景,比如Web
停顿时间VS吞吐量
停顿时间:垃圾收集器做垃圾回收中断应用执行的时间
-XX:MaxGCPauseMillis
吞吐量:花在垃圾收集的时间和花在应用时间的占比。
-XX:GCTimeRatio=<n>,垃圾收集时间占:1/1+n
理想情况下,吞吐量很大,停顿时间很小,现实中,一般吞吐量很大,响应时间很长
串行收集器
-XX:+UseSerialGC 新生代启用串行收集器
-XX:+UseSerialOldGC 老生代启用串行收集器
并行收集器
吞吐量优先
-XX:+UseParallelGC , -XX:+UseParallelOldGC
Sever模式下的默认收集器(根据当前系统的内存和cpu情况决定是启动client模式还是启用server模式,一般情况是内存>2g,双核以上,就认为启动server模式)
检查tomcat是否使用了并行收集器
##修改配置文件
../bin/ catalina.sh
…
JAVA_OPTS="$JAVA_OPTS -XX:+UseParallelGC"
…
##重启tomcat
[root@storm-nimbus-a ~]# jps
3024 Bootstrap
##
[root@storm-nimbus-a bin]# jinfo -flag UseParallelGC 3024
-XX:+UseParallelGC
[root@storm-nimbus-a bin]# jinfo -flag UseParallelOldGC 3024
-XX:+UseParallelOldGC
并发收集器
响应时间优先
CMS: -XX:+UseConcMarkSweepGC –XX:+UseParNewGC
G1:-XX:+UseG1GC
检查tomcat是否使用了并发收集器
##修改配置文件
../bin/ catalina.sh
…
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC"
##重启tomcat
[root@storm-nimbus-a ~]# jps
3774 Bootstrap
##
[root@storm-nimbus-a bin]# jinfo -flag UseConcMarkSweepGC 3774
-XX:+UseConcMarkSweepGC
[root@storm-nimbus-a bin]# jinfo -flag UseParNewGC 3774 //设置了old区,young区默认打开
-XX:+UseParNewGC
检查tomcat是否使用了G1
##修改配置文件
../bin/ catalina.sh
…
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
##重启tomcat
[root@storm-nimbus-a ~]# jps
3774 Bootstrap
##
[root@storm-nimbus-a bin]# jinfo -flag UseG1GC 4247
-XX:+UseG1GC
垃圾收集器搭配
Jdk8推荐使用G1垃圾收集器
实线是相互搭配使用
虚线是CMS回收时,如果空间分配失败,CMS就退化成SerialOld
如何选择垃圾收集器
优先调整堆的大小让服务器自己来选择
如果内存小于100M,使用串行收集器
如果是单核,并且没有停顿时间的要求,串行或者JVM自己选
如果允许停顿时间超过1秒,选择并行或者JVM自己选
如果响应时间最重要,并且不能超过1秒,使用并发收集器
GC调优指南:
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html
从Ergonomics开始,每篇读3遍到5遍