jvm 調優參數

功能開關:
參數
限制
默認值
說明
示例
-XX:-AllowUserSignalHandlers
linux、Solaris
不啓用
允許爲java進程安裝信號處理器,信號處理參數見類:sun.misc.Signal,sun.misc.SignalHandler
-XX:+AllowUserSignalHandlers
-XX:-AllowUserSignalHandlers
-XX:+DisableExplicitGC
 
啓用
禁止在運行期顯示的調用System.gc()
-XX:+DisableExplicitGC
-XX:-DisableExplicitGC
-XX:+FailOverToOldVerifier
jdk6及以後
啓用
如果新的Class校驗器檢查失敗,則使用老的校驗器(失敗原因:因爲JDK6最高向下兼容到JDK1.2,而JDK1.2的class info 與JDK6的info存在較大的差異,所以新校驗器可能會出現校驗失敗的情況)
-XX:+FailOverToOldVerifier
-XX:-FailOverToOldVerifier
-XX:+HandlePromotionFailure
 
java5以前不啓用
java6及以後啓用
關閉新生代收集擔保
-XX:+HandlePromotionFailure
-XX:-HandlePromotionFailure
-XX:+MaxFDLimit
Solaris
啓用
設置java進程可用文件描述符爲操作系統允許的
最大值。
-XX:+MaxFDLimit
-XX:-MaxFDLimit
-XX:PreBlockSpin
-XX:+UseSpinning 必須先啓用
10
控制多線程自旋鎖優化的自旋次數
-XX:PreBlockSpin=10
-XX:-RelaxAccessControlCheck
 
不啓用
在Class校驗器中,放鬆對訪問控制的檢查,作用與reflection裏的setAccessible類似
-XX:+RelaxAccessControlCheck
-XX:-RelaxAccessControlCheck
-XX:+ScavengeBeforeFullGC
 
啓用
在Full GC前觸發一次Minor GC
-XX:+ScavengeBeforeFullGC
-XX:-ScavengeBeforeFullGC
-XX:+UseAltSigs
Solaris
啓用
爲了防止與其他發送信號的應用程序衝突,允許使用候補信號替代 SIGUSR1和SIGUSR2
-XX:+UseAltSigs
-XX:-UseAltSigs
-XX:+UseBoundThreads
Solaris
啓用
綁定所有的用戶線程到內核線程, 減少線程進入飢餓狀態(得不到任何cpu time)的次數
-XX:+UseBoundThreads
-XX:-UseBoundThreads
-XX:+UseGCOverheadLimit
 
啓用
限制GC的運行時間。如果GC耗時過長,就拋OOM
-XX:+UseGCOverheadLimit
-XX:-UseGCOverheadLimit
-XX:+UseLWPSynchronization
solaris
啓用
使用輕量級進程(內核線程)替換線程同步
-XX:+UseLWPSynchronization
-XX:-UseLWPSynchronization
-XX:-UseSpinning
 
1.4.2和1.5需手動啓用
1.6後默認啓用
啓用多線程自旋鎖優化
-XX:+UseSpinning
-XX:-UseSpinning
-XX:+UseTLAB
 
1.4.2以前-client不啓用
其他默認啓用
啓用線程本地緩存區
 
-XX:TLABSize
 
 
設置線程本地分配緩衝區(TLAB)的初始大小(以字節爲單位)
-XX:TLABSize=512k
-XX:+UseSplitVerifier
 
java5默認不啓用
java6默認啓用
使用新的Class類型校驗器
 
 
-XX:+UseThreadPriorities
 
啓用
使用本地線程的優先級
 
-XX:+UseVMInterruptibleIO
solaris
啓用
在solaris中,允許運行時中斷線程
 
 
垃圾收集器相關的參數:
 
參數
限制
默認值
說明
示例
-XX:-UseConcMarkSweepGC
 
不啓用
ParMew + CMS +Serial Old 的組合模式
 
-XX:-UseParallelGC
 
-server 時啓用
其他模式不啓用
Parallel Scavenge  + Serival Old
 
-XX:-UseParallelOldGC
 
不啓用
Parallel Scavenge + Paraller Old
 
-XX:-UseSerialGC
 
-client 時啓用
其他模式不啓用
Serial + Serial Old
 
-XX:-UseParNewGC
 
不啓用
ParNew + Serial Old
 
-XX:SurvivorRatio
 
Solaris amd64: 6 
Sparc in 1.3.1: 25
Solaris platforms 5.0以前: 32
其他默認 8
Eden與Survivor的佔用比例。例如8表示,一個survivor區佔用 1/8 的Eden內存,即1/10的新生代內存,爲什麼不是1/9?
因爲我們的新生代有2個survivor,即S0和S1。所以survivor總共是佔用新生代內存的 2/10,Eden與新生代的佔比則爲 8/10
-XX:SurvivorRatio=8
-XX:TargetSurvivorRatio
 
50
實際使用的survivor空間大小佔比。默認是50%,最高90%
-XX:TargetSurvivorRatio=50
-XX:PretenureSizeThreshold
 
0

設置後,超過這個值,對象直接在old區分配內存

-XX:PretenureSizeThrehold=1024000
-XX: MaxTenuringThreshold
 
15
晉升老年代的對象年齡,每次Minor GC 加一
-XX:MaxTenuringThreshold=15
-XX:UseAdaptiveSizePolicy
 
 
動態調整java堆中各個區域的大小以及進入老年代的年齡
 
-XX:HandlePromotionFailure
 
 
是否允許擔保失敗
 
-XX:ParallelGCThreads
 
 
設置並行GC時經行的內存的線程數
XX:ParallelGCThreads=4
-XX:GCTimeRatio
 
99
GC時間佔總時間的比例。99爲允許 百分之1的時間
-XX:GCTimeRatio=99
-XX:MaxGCPauseMillis
Parallel Scavenge
 
GC的最大停頓時間
-XX:MaxGCPauseMillis=100
-XX:CMSInitiatingOccpancyFraction
CMS
68
設置 CMS 收集器 老年代使用空間超過比例後觸發
-XX:CMSInitiatingOccpancyFraction=68
-XX:UseCMSCompactAtFullCollection
CMS
 
使用 CMS 收集器後是否經行一次內存碎片整理
 
-XX:CMSFullGCsBeforeCompaction
CMS
0
使用 CMS 收集器經行若干次Full GC,進行一次內存碎片整理
XX:CMSFullGCsBeforeCompaction=1
 
 
性能參數:
 
參數
限制
默認值
說明
示例
-XX:+AggressiveOpts
JDK 5 update 6後
java5需手動開啓
java6開啓
啓用JVM開發團隊最新的調優成果。例如編譯優化,偏向鎖,並行年老代收集等
-XX:+AggressiveOpts
 
-XX:CompileThreshold
 
1000
通過JIT編譯器,將方法編譯成機器碼的觸發閥值,可以理解爲調用方法的次數,例如調1000次,將方法編譯爲機器碼
-XX:CompileThreshold=10000
-XX:LargePageSizeInBytes
 
默認4m
amd64位:2m
設置堆內存的內存頁大小
-XX:LargePageSizeInBytes=4m
-XX:MaxHeapFreeRatio
 
70
GC後,如果發現空閒堆內存佔到整個預估上限值的70%,則收縮預估上限值
-XX:MaxHeapFreeRatio=70
-XX:MaxNewSize
 
1.3.1 Sparc: 32m
1.3.1 x86: 2.5m
新生代佔整個堆內存的最大值
-XX:MaxNewSize
-XX:MaxPermSize
 
5.0以後: 64 bit VMs會增大預設值的30%,1.4 amd64: 96m 
1.3.1 -client: 32m
 其他默認 64m
Perm(俗稱方法區)佔整個堆內存的最大值
-XX:MaxPermSize=64m
-XX:MinHeapFreeRatio
 
40
GC後,如果發現空閒堆內存佔到整個預估上限值的40%,則增大上限值
-XX:MinHeapFreeRatio=40
-XX:NewRatio
 
Sparc -client: 8
x86 -server: 8
x86 -client: 12
-client: 4 (1.3)
8 (1.3.1+), x86: 12
其他默認 2
新生代和年老代的堆內存佔用比例, 例如2表示新生代佔年老代的1/2,佔整個堆內存的1/3
-XX:NewRatio=2
-XX:NewSize
 
5.0以後: 64 bit Vms 會增大預設值的30%,x86: 1m,
 x86 5.0以後: 640k,
其他默認 2.125m
新生代預估上限的默認值
-XX:NewSize=2.125m
-XX:ReservedCodeCacheSize
 
Solaris 64-bit, amd64, -server x86: 48m
1.5.0_06之前, Solaris 64-bit amd64: 1024m
其他默認 32m
設置代碼緩存的最大值,編譯時用
-XX:ReservedCodeCacheSize=32m
-XX:ThreadStackSize
 
Sparc: 512, Solaris x86: 320 (5.0以前 256),
Sparc 64 bit: 1024
Linux amd64: 1024 (5.0 以前 0),
其他默認 512.
線程堆棧大小
-XX:ThreadStackSize
-XX:+UseBiasedLocking
JDK 5 update 6後
JDK6啓用
啓用偏向鎖
-XX:+UseBiasedLocking
-XX:+UseFastAccessorMethods
 
啓用
優化原始類型的getter方法性能(get/set:Primitive Type)
-XX:+UseFastAccessorMethods
-XX:-UseISM
 
啓用
啓用solaris的ISM
-XX:-UseISM
-XX:+UseLargePages
JDK 5 update 5後
JDK6啓用
啓用大內存分頁
-XX:+UseLargePages
-XX:+UseMPSS
 
1.4.1之前: 不啓用,
其餘版本啓用
啓用solaris的MPSS,不能與ISM同時使用
-XX:+UseMPSS
-XX:+UseStringCache
 
開啓
啓用緩存常用的字符串。
-XX:+UseStringCache
-XX:AllocatePrefetchLines
 
1
使用JIT編譯代碼中生成的預取指令進行最後一次對象分配後要加載的緩存線路數。如果最後分配的對象是實例,則默認值爲1;如果最後分配的對象是數組,則默認值爲3。
-XX:AllocatePrefetchLines=1
-XX:AllocatePrefetchStyle
 
1
爲預取指令生成代碼樣式。
0 -沒有預取指令生成*d*,
1 -每次分配後執行預取指令,
2 -執行預取指令時,使用TLAB分配水印指針到門
-XX:AllocatePrefetchStyle=1
-XX:+UseCompressedStrings
Java 6 update 21有一選項
 
其中,對於不需要16位字符的字符串,可以使用byte[] 而非char[]。對於許多應用,這可以節省內存,但速度較慢(5%-10%)
 
-XX:+OptimizeStringConcat
在Java 6更新20中
 
優化字符串連接操作在可能的情況下
 
-XX:InitialTenuringThreshold
 
 
設置初始的對象在新生代中最大存活次數
-XX:InitialTenuringThreshold=7
-XX:MaxTenuringThreshold
 
默認爲15
CMS默認4
設置對象在新生代中最大的存活次數,最大值15,並行回收機制
-XX:MaxTenuringThreshold=15
-XX:+UseCompressedOops
 
 
支持使用壓縮指針(對象引用表示爲32位偏移量,而不是64位指針)來優化64位性能,Java堆大小小於32gb
-XX:+UseCompressedOops
 
基本參數:
 
參數
限制
默認值
說明
示例
-Xloggc:<file>
 
 
將虛擬機每次垃圾回收的信息寫到日誌文件中,文件名由file指定,文件格式是平文件,內容和-verbose:gc輸出內容相同
 
-verbose[:class|gc|jni]
 
 
在輸出設備上顯示虛擬機運行信息。
 
-version
 
 
顯示可運行的虛擬機版本信息然後退出。一臺機器上裝有不同版本的JDK時
 
-showversion
 
 
顯示版本信息以及幫助信息
 
-ea[:<packagename>...|
:<classname>]
JDK1.4開始
關閉
設置虛擬機是否啓動斷言機制
–ea:com.foo.util 
-da[:<packagename>...|
:<classname>]
JDK1.4開始
關閉
用來設置虛擬機關閉斷言處理
–da:com.foo.util 
-esa | -enablesystemassertions
 
關閉
設置虛擬機顯示系統類的斷言
 
-dsa | -disablesystemassertions
 
關閉
設置虛擬機關閉系統類的斷言。
 
-agentlib:<libname>[=<options>]
JDK5開始
 
用於虛擬機裝載本地代理庫
-agentlib:hprof=help來得到使用幫助列表。在jre\bin目錄下可發現hprof.dll文件
-agentpath:<pathname>
[=<options>]
 
 
設置虛擬機按全路徑裝載本地庫,不再搜索PATH中的路徑。其他功能和agentlib相同。
 
-javaagent:<jarpath>[=<options>]
 
 
虛擬機啓動時裝入java語言設備代理。Jarpath文件中的mainfest文件必須有Agent-Class屬性。代理類要實現public static void premain(String agentArgs, Instrumentation inst)方法。當虛擬機初始化時,將按代理類的說明順序調用premain方法。
 

-Xnoclassgc

 
關閉
禁用對於類的垃圾收集
-Xnoclassgc

-Xrs

 
 
減少虛擬機中操作系統的信號(singals)的使用。該參數通常用在虛擬機以後臺服務方式運行時使用(如Servlet)
 
-Xmixed
-client
 
虛擬機對使用頻率高的方式進行Just-In-Time編譯和執行,對其他方法使用解釋方式執行。該方式是虛擬機缺省模式
 
-Xint
-client
 
運行的虛擬機以解釋方式執行類的字節碼,不將字節碼編譯爲本機碼
與 Xcomp 相對
-Xincgc
 
關閉
jdk8不推薦開啓
啓動增量垃圾收集器. 增量垃圾收集器能減少偶然發生的長時間的垃圾回收造成的暫停時間。但增量垃圾收集器和應用程序併發執行,因此會佔用部分CPU在應用程序上的功能
 
-Xbootclasspath:path
 
 
改變虛擬機裝載缺省系統運行包rt.jar而從-Xbootclasspath中設定的搜索路徑中裝載系統運行類;
/a:將在缺省搜索路徑後加上path 中的搜索路徑。
/p:在缺省搜索路徑前先搜索path中的搜索路徑
-Xbootclasspath/a:path
-Xbootclasspath/p:path
-Xbatch
 
後臺編譯類代碼
虛擬機的缺省運行方式是在後臺編譯類代碼,然後在前臺執行代碼. 將關閉虛擬機後臺編譯,在前臺編譯完成後再執行。
 
-D<propertyName>=value
 
 
在虛擬機的系統屬性中設置屬性名/值對
-Dname=”space string”
運行在此虛擬機之上的應用程序System.getProperty(“propertyName”)得到value的值。
-classpath,-cp
 
 
虛擬機在運行一個類時,需要將其裝入內存,虛擬機搜索類的方式和順序如下:
Bootstrap classes,Extension classes,User classes
 
-Xms<size>
 
物理內存的 1/64 (< 1G)
初始堆大小;空餘堆內存小於 40%時,jvm會增大堆直到-Xmx的值
-Xms64M
-Xmx<size>
 
物理內存的 1/4 (< 1G)
最大堆內存;空餘堆內存大於 70%時,jvm會減少堆直到-Xms的值
-Xmx512M
-Xmn
 
 
年輕代大小。此處的大小是(eden+ 2 survivor space).與jmap -heap中顯示的New gen是不同的。 整個堆大小=年輕代大小 + 年老代大小 + 持久代大小. 增大年輕代後,將會減小年
-Xmn32M
-Xss<size>
 
1M
設置線程棧的大小,缺省單位爲字節
-Xss2M
-Xprof
 
 
輸出CPU運行時的診斷信息
 
-Xfuture
 
不進行嚴格的格式檢查
對類文件進行嚴格格式檢查,以保證類代碼符合類代碼規範。爲保持向後兼容,虛擬機缺省不進行嚴格的格式檢查
 
-Xcheck:jni
 
 
調用JNI函數時進行附加的檢查,特別地虛擬機將校驗傳遞給JNI函數參數的合法性,在本地代碼中遇到非法數據時,虛擬機將報一個致命錯誤而終止。使用該參數後將造成性能下降
 
-XX:MaxHeapSize
 
必須是1024的倍數且大於2 MB
設置內存分配池的最大大小
-XX:MaxHeapSize=80m

-XX:MetaspaceSize

 
大小取決於平臺
設置分配的類元數據空間的大小,該類元數據空間將在首次超過垃圾收集時觸發垃圾收集
XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize
 
 
最大元素區
-XX:MaxMetaspaceSize=512m
-Xcomp
 
 
強制虛擬機運行編譯模式
與Xint 相對
-XX:UseCounterDecay
 
 
關閉熱度衰減,讓熱點基數器減半
 
-XX:CounterHalfLifeTime
 
 
設置半衰週期的時間,單位是秒
 
-XX:BackEdgeThreshold
 
 
目前暫未使用,設置回邊數的閾值
 
-XX:OnStackReplacePercentage
 
Client 933
Server 140
Client模式下 閾值爲 13995
Server模式下閾值爲 10700
 
-XX:-BackgroundCompilation
 
 
關閉後臺編譯線程
 
-XX:+DoEscapeAnalysis
 
 
手動開啓內存逃逸分析
 
-XX:PrintEscapeAnalysis
 
 
查看逃逸分析結果
 
-XX:EliminateAllocations
 
 
開啓標量替換
 
-XX:EliminateLocks
 
 
開啓同步鎖消除
 
-XX:+PrintEliminateAllocations
 
 
查看標量替換結果
 
調試參數:
 
參數
限制
默認值
說明
示例
-XX:-CITime
 
 
打印發費在JIT編譯上的時間
 
-XX:ErrorFile
JDK6
 
錯誤文件
-XX:ErrorFile=./hs_err_pid<pid>.log
-XX:-ExtendedDTraceProbes
JDK6
 
啓用性能的影響DTrace探測器
 
-XX:HeapDumpPath
 
 
指定HeapDump的文件路徑或目錄
-XX:HeapDumpPath=
./java_pid<pid>.hprof
-XX:-HeapDumpOnOutOfMemoryError
 
 
當拋出OOM時進行HeapDump
 
-XX:OnError
 
 
當發生錯誤時執行用戶指定的命令
-XX:OnError=”<cmd args>;<cmd args>”
-XX:OnOutOfMemoryError
 
 
當發生OOM時執行用戶指定的命令
-XX:OnOutOfMemoryError=”<cmd args>;<cmd args>”
-XX:-PrintClassHistogram
1.4.2
 
當Ctrl+Break發生時打印Class實例信息,與jmap -histo相同
-XX:-PrintClassHistogram
-XX:-PrintConcurrentLocks
6
 
當Ctrl+Break發生時打印java.util.concurrent的鎖信息, 與jstack -l相同
-XX:-PrintConcurrentLocks
-XX:-PrintCommandLineFlags
5
 
打印命令行上的標記
-XX:-PrintCommandLineFlags
-XX:-PrintCompilation
 
 
當方法被編譯時打印信息
-XX:-PrintCompilation
-XX:-PrintGC
 
 
當GC發生時打印信息
-XX:-PrintGC
-XX:-PrintGCDetails
1.4.0
 
打印GC詳細信息
-XX:-PrintGCDetails
-XX:-PrintGCTimeStamps
1.4.0
 
打印GC用時
-XX:-PrintGCTimeStamps
-XX:-PrintTenuringDistribution
 
 
打印Tenuring年齡信息
-XX:-PrintTenuringDistribution
-XX:-TraceClassLoading
 
 
跟蹤類加載
-XX:-TraceClassLoading
-XX:-TraceClassLoadingPreorder
1.4.2
 
跟蹤所有加載的引用類
-XX:-TraceClassLoadingPreorder
-XX:-TraceClassResolution
1.4.2
 
跟蹤常量池的變化
-XX:-TraceClassResolution
-XX:-TraceClassUnloading
 
 
跟蹤類的卸載
-XX:-TraceClassUnloading
-XX:-TraceLoaderConstraints
6
 
加載器約束的跟蹤記錄
-XX:-TraceLoaderConstraints
-XX:+PerfSaveDataToFile
 
 
退出時保存jvmstat二進制文件
-XX:+PerfSaveDataToFile
-XX:+AlwaysPreTouch
 
 
在JVM初始化期間預先接觸Java堆。因此,堆的每一頁在初始化期間都被調零,而不是在應用程序執行期間遞增。
-XX:+AlwaysPreTouch
-XX:AllocatePrefetchDistance
 
 
設置對象分配的預取距離。即將用新對象的值寫入的內存被預取到緩存中,這個距離(以字節爲單位)超出了最後一個分配對象的地址。每個Java線程都有自己的分配點。默認值隨運行JVM的平臺而變化
-XX:AllocatePrefetchDistance=
-XX:InlineSmallCode
 
 
當編譯的代碼小於指定的值時,內聯編譯的代碼
-XX:InlineSmallCode=
-XX:MaxInlineSize
 
 
內聯方法的最大字節數
-XX:MaxInlineSize=35
-XX:FreqInlineSize
 
 
內聯頻繁執行的方法的最大字節碼大小
-XX:FreqInlineSize=
-XX:LoopUnrollLimit
 
隨運行JVM的平臺而變化
展開具有服務器編譯器中間表示節點計數小於此值的循環體。服務器編譯器使用的限制是這個值的函數,而不是實際值。
-XX:LoopUnrollLimit=
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章