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

 

 

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