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