JDK8 JVM参数大全指导手册
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 |
-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 |
使System.gc()显式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一样大,一般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的运行时间,通过统计GC时间来预测是否要OOM了,提前抛出异常,防止OOM发生 |
并行/并发回收器在GC回收时间过长时会抛出OutOfMemroyError。过长的定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存。用来避免内存过小造成应用不能正常工作 |
|
-XX:+UseStringDeduplication |
开启字符串去重 |
G1回收器生效 |
|
参考资料:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html