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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章