目录
五、关系图
一、背景
前面的章节单独说了下CMS和G1,而更早的收集器如并没有被淘汰,当CMS和G1收集失败后会转为使用Serial Old收集器进行一次full gc,所以学习其他的收集器也是有必要的。
二、垃圾收集器比较
垃圾收集器特点适合场景
Serial(新生代)单线程全程STW流量小、内存<4G、单核
Serial Old(老)同上同上
ParNew(新)Serial的多线程版本搭配CMS实现低停顿
ParallelScavenge(新)可设置最大gc停顿时间及gc时间比吞吐高(用户时间/用户+GC),适用于非交互式,如批处理应用
Parallel Old(老)同上同上
CMS(老年代)低停顿、易产生内存碎片想低停顿但可以容忍较多的fgc
G1(新+老)低停顿、不易产生内存碎片内存>=6G、停顿可控、不容忍频繁fgc
ZGC(新+老)STW不超过10毫秒
STW不会随堆大小而增加
堆范围几百M~几TB。
使用大中小内存低停顿为目标
G1的目标是淘汰CMS,ZGC的目标是淘汰G1
三、常用JVM参数
CMS和G1相关的参数在上2篇章节已说明,这里不再列。
参数意义优化建议默认值
-Xms2000m 设置堆初始2G同Xmx,避免动态调整,默认空余堆内存小于40%会调增大于70%会调小物理内存的1/64
-Xmx2000m设置堆最大2G同Xms物理内存的1/4
-Xss每个线程的栈大小无特殊不要超过默认值,否则会影响线程数1M
-XX:NewRatio=4 年轻代(eden+2s):老年代=1:4若已设置xmn,不需设此参数,另外选择G1和ZGC不建议设此参数2
-XX:SurvivorRatio=82s:eden=1:8G1和ZGC动态分配不建议设置此参数8
-XX:MaxGCPauseMillis=100允许的GC最大的暂停时间,过小GC就会频繁,过大暂停久太过频繁或者暂停久可通过此参数调整200ms
-XX:+TieredCompilation使用分层编译来提升启动速度默认打开true
-XX:CICompilerCount=N编译线程的数目无需要不必调整4
-XX:-UseBiasedLocking 禁用偏向锁在存在大量锁对象的创建并高度并发的环境下禁用偏向锁能够带来一定的性能优化打开
-XX:AutoBoxCacheMaxJDK默认只缓存 -128 ~ +127的Integer 和 Long,此参数更改次值对于频繁创建Integer对象的可使用此参数优化128
-XX:+AlwaysPreTouchJAVA进程启动的时候,虽然我们可以为JVM指定合适的内存大小,但是这些内存操作系统并没有真正的分配给JVM,而是等JVM访问这些内存的时候,才真正分配,这样会造成以下问题。
1、GC的时候,新生代的对象要晋升到老年代的时候,需要内存,这个时候操作系统才真正分配内存,这样就会加大young gc的停顿时间;
2、可能存在内存碎片的问题。
JVM就会先访问所有分配给它的内存,让操作系统把内存真正的分配给JVM.后续JVM就可以顺畅的访问内存了。
false
-XX:-OmitStackTraceInFastThrow抛出相同的异常N次之后,JVM会对某些特定异常如NPE进行优化,不再带异常栈。如日志里一条条Nul Point Exception不接收此操作,可以关闭true
-XX:+PrintGCApplicationStoppedTime除了打印清晰的完整的GC停顿时间外,还可以打印其他的JVM停顿时间打开false
-XX:+PrintPromotionFailure打开了就知道是多大的新生代对象晋升到老生代失败从而引发Fgc打开false
比较通用的配置方案:
JVM_ARGS="-server -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Djava.io.tmpdir=/tmp -Djava.net.preferIPv6Addresses=false"
JVM_GC="-XX:+UseG1GC -XX:G1HeapRegionSize=4M -XX:InitiatingHeapOccupancyPercent=40 -XX:MaxGCPauseMillis=100 -XX:-UseBiasedLocking -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCDateStamps -XX:+PrintStringTableStatistics -XX:+PrintAdaptiveSizePolicy -XX:+PrintGCApplicationStoppedTime -XX:+PrintFlagsFinal -XX:-UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:$LOG_PATH/gc.log -XX:ErrorFile=$LOG_PATH/vmerr.log -Xss512k -Xmx"$jvmSize" -Xms"$jvmSize" -XX:MetaspaceSize="$MaxMetaspaceSize" -XX:MaxMetaspaceSize="$MaxMetaspaceSize" -XX:+AlwaysPreTouch -XX:ReservedCodeCacheSize="$ReservedCodeCacheSize" -XX:InitialCodeCacheSize="$InitialCodeCacheSize" -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_PATH"
其中
case Using G1 GC
case 1G: Xms=512m MaxMetaspaceSize=64m ReservedCodeCacheSize=32m InitialCodeCacheSize=32m
case2G: Xms=1g MaxMetaspaceSize=128m ReservedCodeCacheSize=64m InitialCodeCacheSize=64m
case4G: Xms=2g MaxMetaspaceSize=256m ReservedCodeCacheSize=64m InitialCodeCacheSize=64m
case8G: Xms=4g MaxMetaspaceSize=256m ReservedCodeCacheSize=128m InitialCodeCacheSize=128m
case16G:Xms=12g MaxMetaspaceSize=512m ReservedCodeCacheSize=256m InitialCodeCacheSize=256m
case22~28G: Xms=18g MaxMetaspaceSize=512m ReservedCodeCacheSize=256m InitialCodeCacheSize=256m
case32~44G: Xms=24g MaxMetaspaceSize=1g ReservedCodeCacheSize=512m InitialCodeCacheSize=512m
case64~88G: Xms=32g MaxMetaspaceSize=2g ReservedCodeCacheSize=1g InitialCodeCacheSize=1g
四、垃圾收集器对比
CMS和G1在上2章节已说明。
简介新/老基于算法
简介新/老基于算法
Serial单线程,全程STW新生代复制
ParNewSerial的多线程版本新生代复制
Parallel Scavenge可以通过调整参数,控制停顿时间或最大的吞吐量新生代复制
Serial Old单线程,CMS和G1失败采用此老年代标记整理
Parallel Old可以通过调整参数,控制停顿时间或最大的吞吐量老年代标记整理
五、关系图