JDK8JVM参数⼿册调优指南
JVM是Java Virtual Machine(Java虚拟机)的缩写,我们开发的java程序运⾏在JVM上,理想情况是不设置任何JVM参数,java程序就可以长期稳定⾼效运⾏。但事与愿违,JVM涉及⾃动垃圾回收机制,运⾏时即时编译,class类加载等,JVM提供了⼤量的⾼级参数选项供我们使⽤,来提升系统性能。掌握JVM参数是JVM调优的第⼀步,本⽂着重介绍JVM调优常⽤的JVM参数。
JVM参数分为3类:
标准参数(-),所有JVM都必须⽀持这些参数的功能,⽽且向后兼容;
⾮标准参数(-X),默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满⾜,且不保证向后兼容;
⾮稳定参数(-XX),此类参数各个JVM实现会有所不同,将来可能会不被⽀持,需要慎重使⽤;
标准参数 -
-version查看版本⽰例备注
-Dproperty=value设置系统配合-Dfoo="foo bar"
-verbose:class打印每个class信
-verbose:gc打印每次gc信息
⾮标参数 -X
-Xbootclasspath/a:path BootStrap class
扩展,后缀在核
⼼class搜索路径
后⾯,启动类加
载器会加载此路
径下的class
java -
Xbootclasspath/a:/usrhome/thirdlib.jar:
-jar yourJarExe.jar
分隔符与classpath参数类似,unix
使⽤:号,windows使⽤;号
-Xloggc:filename设置GC log的位
-Xloggc:log/gc.log
-Xmn⼤⼩设置年轻代⼤⼩
(初始化和最
⼤)
-Xmn256m
分别指定年轻代的初始化和最⼤⼤
-XX:NewSize
-XX:MaxNewSize
建议年轻代占堆⼤⼩的1/4 ~ 1/2
-Xms⼤⼩设置堆的初始化
⼤⼩
-Xms1024m=-XX:InitialHeapSize
-Xmx⼤⼩设置堆的最⼤⼤
⼩-Xmx2048m
= XX:MaxHeapSize
⼀般Xms=Xmx,防⽌扩容和缩容
-Xnoclassgc关闭虚拟机对
class的垃圾回收
尽量不要使⽤
-XshowSettings:范围打印配置项信
息,可选项有all /
locale /
properties / vm
-XshowSettings:
-Xss⼤⼩设置线程栈⼤⼩-Xss1m = -XX:ThreadStackSize
默认值:
● Linux/ARM (32-bit): 320 KB
● Linux/i386 (32-bit): 320 KB
● Linux/x64 (64-bit): 1024 KB
● OS X (64-bit): 1024 KB
● Oracle Solaris/i386 (32-bit): 320 KB
● Oracle Solaris/x64 (64-bit): 1024 KB
JVM设置的选项
-XX:+PrintCommandLineFlags JVM设置的选项和值,⽐如:堆⼤⼩、垃圾回收器等
不稳定参数 -XX
-XX:ErrorFile=⽂件设置错误⽇志路
径-XX:ErrorFile=./hs_err_pid%p.log %p为当前进程号
-
XX:OnError=命令错误发⽣时执⾏
命令
-XX:OnError="gcore %p;dbx - %p"
-XX:OnOutOfMemoryError=命令内存溢出时执⾏
命令
-XX:MaxDirectMemorySize=size设置直接内存最
⼤值-XX:MaxDirectMemorySize=100m
默认为0
当直接内存达到设置的最⼤值会
FullGC
-XX:ObjectAlignmentInBytes=alignment 设置java对象的内存对齐,默认是8字节
-
XX:ThreadStackSize设置线程栈⼤⼩-XX:ThreadStackSize=1m= -Xss
-XX:-UseBiasedLocking禁⽤偏向锁默认开启,不禁⽤
如果使⽤的是⼤量的没有竞争的同步,使⽤偏向锁会提升性能
-XX:-UseCompressedOops禁⽤压缩指针堆内存⼩于32G时默认开启
开启后,对象引⽤是32位⽽不是64位,可以提升性能。
只有64位的jvm才⽣效
-XX:+DoEscapeAnalysis开启逃逸分析默认开启-XX:+Inline开启⽅法内联默认开启
-XX:InlineSmallCode=⼤⼩设置应内联的已
编译⽅法的最⼤
代码⼤⼩,只有
⼩于此数值的才
会内联
默认1000字节
-XX:MaxInlineSize=⼤⼩设置要内联⽅法
的最⼤字节码⼤
默认35字节
-XX:+OptimizeStringConcat开启字符串连接
优化
默认开启
-XX:+PrintInlining打印⽅法内联默认关闭,需和
-
XX:+UnlockDiagnosticVMOptions ⼀起使⽤
-XX:-TieredCompilation关闭分层编译默认开启
-XX:+HeapDumpOnOutOfMemoryError OOM时堆内存dump到当前⽬录
-XX:HeapDumpPath=路径设置堆内存dump
的路径
-XX:HeapDumpPath=
/var/java_pid%p.hprof
-XX:+UnlockDiagnosticVMOptions开启jvm诊断功能
选项
垃圾回收参数
-XX:+AggressiveHeap开启堆最优化设
默认关闭
-XX:+CMSClassUnloadingEnabled 当使⽤CMS垃圾
收集器时,允许
类卸载
默认开启
-XX:CMSExpAvgFactor=percent 指定垃圾收集消
耗的时间百分
⽐。
默认这个数是25%,就是25标准参数 -
⽐。
-
XX:CMSInitiatingOccupancyFraction=percent 设置CMS回收开
始的⽼年代百分
默认-1,任何的负值表⽰会使⽤-
XX:CMSTriggerRatio选项来定义
这个百分⽐数
-XX:+CMSScavengeBeforeRemark在CMS重新标记
之前执⾏ygc操作默认关闭
在remark时间过长时可以开启;开启减少remark的STW时间
-XX:CMSTriggerRatio=percent设置CMS开始的
百分⽐默认80,
((100 - MinHeapFreeRatio) + (double)( CMSTriggerRatio * MinHeapFreeRatio) / 100.0) / 100.0
=92%
-XX:MinHeapFreeRatio=percent GC之后堆内存最
⼩剩余百分⽐,
如果⼩于此值,
则⾃动扩容
默认40%
-XX:MaxHeapFreeRatio=percent GC之后堆内存最
⼤剩余百分⽐,
如果⼩于此值,
则⾃动缩容
默认70%
-XX:ParallelGCThreads=threads设置Parallel GC
的线程数默认根据cpu个数,<=8,则使⽤8个,>8个3+5N/8
1台服务器只有1个jvm时使⽤默认值较好,如果有n个jvm,cpu个数 / n⽐较合适
-XX:ConcGCThreads=个数并发GC的线程数默认值取决于cpu个数ConcGCThreads = (ParallelGCThreads + 3)/4
-XX:+DisableExplicitGC使()显
式gc失效
默认不开启,
-XX:G1HeapRegionSize=size 当使⽤G1收集器
时,设置java堆
被分割的region⼤
1M~32M
默认根据堆内存最优化设置
-XX:+G1PrintHeapRegions打印G1收集器收
集的区域
默认关闭
-XX:G1ReservePercent=percent 设置堆内存保留
⼤⼩,以防晋升
失败
0~50
默认10%
-
XX:InitialHeapSize=size堆初始⼤⼩-Xms -XX:MaxHeapSize=size堆最⼤⼤⼩-Xmx
-XX:InitialSurvivorRatio=ratio 设置伊甸园区和
幸存区初始⽐例
默认为8:1
-XX:SurvivorRatio=ratio设置伊甸园区和
幸存区⽐例默认为8:1 8:1:1
XX:TargetSurvivorRatio YGC之后,幸存
区期望百分⽐
默认 50%
-
XX:InitiatingHeapOccupancyPercent=percent 堆占⽤达到多少
开始并发垃圾回
只有并发垃圾回收器⽣效
-XX:MaxGCPauseMillis=time GC最⼤暂停时间
ms
默认没有最⼤暂停时间
-XX:MetaspaceSize=size 元空间多次扩容
后超过此值就会
full gc
默认⼤约20M
元空间使⽤本地内存
-
XX:MaxMetaspaceSize=size设置元空间最⼤
⼤⼩默认不限制
建议和MetaspaceSize⼀样⼤,⼀
标准参数 -
-XX:MaxMetaspaceSize=size
⼤⼩建议和MetaspaceSize⼀样⼤,⼀
般256M
-XX:NewSize=size设置年轻代初始
⼤⼩
建议年轻代占堆⼤⼩的1/4 ~ 1/2
-XX:MaxNewSize=size设置年轻代最⼤
⼤⼩
默认根据最⼤效能分配
-XX:MaxTenuringThreshold=threshold 最⼤晋升年龄,
从年轻代到⽼年
默认:
15 - 并⾏回收器
6 - CMS
-XX:NewRatio=ratio设置⽼年代和新
⽣代⽐例默认2
⽼年代 : (伊甸园 + 2个幸存区)
-
XX:+PrintGC打印GC信息默认关闭-XX:+PrintGCDetails打印GC详细信息默认关闭
-XX:+PrintTenuringDistribution打印晋升分配Desired survivor size 48286924 bytes, new threshold 10 (max 10)
- age 1: 28992024 bytes, 28992024 total
- age 2: 1366864 bytes, 30358888 total
- age 3: 1425912 bytes, 31784800 total
-XX:+ScavengeBeforeFullGC Full gc之前先ygc默认开启,oracle建议开启
-XX:+UseTLAB年轻代使⽤线程
局部缓存默认开启效率⾼
-XX:TLABSize=size 设置初始化thread-local allocation buffer (TLAB)⼤⼩
-XX:+UseAdaptiveSizePolicy开启⾃适应⼤⼩
(年轻代3个区域)JDK 1.8 默认使⽤ UseParallelGC 垃圾回收器,该垃圾回收器默认启动了 AdaptiveSizePolicy
-XX:+UseSerialGC
-XX:+UseParallelGC年轻代使⽤并⾏
回收器
-XX:+UseParallelOldGC⽼年代使⽤并⾏
回收器
-XX:+UseParNewGC 为配置CMS,年轻代使⽤ParNew 回收器,CMS会默认开启
-XX:+UseConcMarkSweepGC使⽤CMS回收器-XX:+UseG1GC使⽤G1回收器
-XX:+UseGCOverheadLimit 限制GC的运⾏时jvm调优参数
间,通过统计GC
时间来预测是否
要OOM了,提前
抛出异常,防⽌
OOM发⽣
并⾏/并发回收器在GC回收时间过
长时会抛出OutOfMemroyError。
过长的定义是,超过98%的时间⽤
来做GC并且回收了不到2%的堆内
存。⽤来避免内存过⼩造成应⽤不
能正常⼯作
-XX:+UseStringDeduplication开启字符串去重G1回收器⽣效
标准参数 -
参考资料: