參數
|
限制
|
默認值
|
說明
|
示例
|
-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=
|