JVM-Java運行參數
- 1. 概述
- 2. 標準參數(-)
- 3. 非標準參數(-X)
- 4. 非 stable 參數(-XX)
- -XX:GCTimeRatio=n
- -XX:MaxGCPauseMills
- -XX:MaxTenuringThreshold
- -XX:ParallelGCThreads
- -XX:PretenureSizeThreshold
- -XX:+PrintGCDetails
- -XX:SurvivorRatio
- -XX:UseAdaptiveSizePolicy
- -XX:+UseSerialGC
- -XX:+TraceClassLoading
- -XX:MetaspaceSize
- -XX:MaxMetaspaceSize
- -XX:+UseParallelGC
- -XX:+UseParallelOldGC
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:+PrintGCTimeStamps
- -XX:+PrintGCDateStamps
- -XX:+UseConcMarkSweepGC
- -XX:-DisableExplicitGC
- -XX:+MaxFDLimit
- -XX:+ScavengeBeforeFullGC
- -XX:+UseGCOverheadLimit
- -XX:-UseConcMarkSweepGC
- -XX:-UseParallelGC
- -XX:-UseParallelOldGC
- -XX:-UseSerialGC
- -XX:+UseThreadPriorities
- -XX:LargePageSizeInBytes=4m
- -XX:MaxHeapFreeRatio=70描述
- -XX:MinHeapFreeRatio=40
- -XX:NewRatio=2
- -XX:ReservedCodeCacheSize=32m
- -XX:ThreadStackSize=512
- -XX:+UseLargePages
- -XX:HeapDumpPath=./java_pid.hprof
- -XX:-HeapDumpOnOutOfMemoryError
- -XX:-PrintConcurrentLocks
- -XX:-TraceClassLoading
- -XX:OnError=";"
- 參考文檔
1. 概述
Java 支持的運行參數包括如下幾種:
- 標準參數(-):所有的 JVM 實現都必須實現這些參數的功能,而且向後兼容
- 非標準參數(-X):官方 JVM 實現這些參數的功能,但是並不保證所有 JVM 實現都滿足,且不保證向後兼容
- 非 Stable 參數(-XX):此類參數各個 JVM 實現會有所不同,將來可能會隨時取消,需慎重使用
2. 標準參數(-)
標準參數又分爲如下幾種:
- 運行模式相關的,如 -server、-client
- 類、jar 路徑相關的,如 -cp、-classpath
- 運行調試相關的,如斷言開關(-ea 和 -da)、-verbose 系列(-verbose:class,-verbose:gc 等)
- 設置系統變量的 -D 參數
2.1 運行模式相關的
-client 和 -server
JVM 工作在 Server 模式可以大大提高性能,但應用的啓動會比 Client 模式慢大概10%。
當該參數不指定時,虛擬機啓動檢測主機是否爲服務器,如果是,則以 Server 模式啓動,否則以 Client 模式啓動。
Client 模式啓動速度較快,Server 模式啓動較慢;但是啓動進入穩定期長期運行之後 Server 模式的程序運行速度比 Client 要快很多。這是因爲 Server 模式啓動的JVM採用的是重量級的虛擬機,對程序採用了更多的優化;而 Client 模式啓動的 JVM 採用的是輕量級的虛擬機。所以 Server 啓動慢,但穩定後速度比 Client 遠遠要快。
2.2 類、jar 路徑相關的
-cp
-classpath
2.3 運行調試相關的
verbose
在程序運行的時候究竟會有多少類被加載呢,一個簡單程序會加載上百個類的!
你可以用 verbose:class 來監視,在命令行輸入 java -verbose:class XXX (XXX爲程序名) 你會在控制檯看到加載的類的情況。
verbose 和 verbose:class 含義相同,輸出虛擬機裝入的類的信息,顯示的信息格式如下:
[Loaded java.io.FilePermission$1 from shared objects file]
當虛擬機報告類找不到或類衝突時可用此參數來診斷從虛擬機裝入類的情況。
-verbose:class
顯式虛擬機記載的類的情況
-verbose:gc
顯示虛擬機內存回收情況,在虛擬機發生內存回收時在輸出設備顯示內存回收信息,格式如下:
[Full GC 268K->168K(1984K), 0.0187390 secs]
-verbose:gc // 虛擬機發生 GC 時,打印內存回收情況
-verbose:jni
斷言
Java 斷言默認是不啓用的。在運行時,是需要顯式開啓才能生效,否則斷言沒有任何意義。
斷言可以開啓局部斷言,格式如下:
-ea:<classname> java -ea:MyClass1 打開 MyClass1 的 assertion
-da:<classname> java -da: MyClass1 關閉MyClass1的assertion
-ea:<packagename> java -ea:pkg1 打開pkg1包的assertion
-da:<packagename> java -da:pkg1 關閉pkg1包的assertion
-ea:... java -ea:... 打開缺省包(無名包)的assertion
-da:... java -da:... 關閉缺省包(無名包)的assertion
-ea:<packagename>... java -ea:pkg1... 打開pkg1包和其子包的assertion
-da:<packagename>... java -da:pkg1... 關閉pkg1包和其子包的assertion
-esa java -esa 打開系統類的assertion
-dsa java -dsa 關閉系統類的assertion
當開始斷言後,程序中的如下代碼就會生效:
assert <布爾表達式>
assert <布爾表達式> : <錯誤信息>
-ea
開啓斷言
-da
關閉斷言,也可不指定 -ea 參數(默認關閉斷言)
2.4 設置系統環境變量的 -D 參數
3. 非標準參數(-X)
3.1 堆棧配置、垃圾回收
-Xmx
設置 JVM 堆的最大值
-Xmx3550 // 設置 JVM 堆的最大值爲 3550M
-Xms
設置 JVM 堆的最小值
-Xms3550M // 設置 JVM 堆的最小值爲 3550M
-Xmn
設置初始和最大的年輕代大小,可以指定單位k(K),m(M),g(G)。
年輕代用於存儲新創建的對象,這個區域的垃圾回收的頻率要比其他區域高的多。如果這個區域太小了,那麼垃圾回收的次數就會太多;如果太大了,垃圾回收就會浪費很多的時間。oracle建議年輕代的大小是堆總大小的四分之一到二分之一之間。
我們還可以通過其他兩個選項來代替這個選項來指定年輕代最小和最大內存:
-XX:NewSize 設置年輕代的初始內存
-XX:MaxNewSize 設置年輕代的最大內存
# 設置新生代大小爲 2G
-Xmn2G
# 下面的例子展示了怎麼設置年輕代的大小爲256M
-Xmn256m
-Xmn262144k
-Xmn268435456
-XX:NewSize
-XX:NewSize 設置年輕代的初始內存;
-XX:NewSize=512m # 設置年輕代的初始內存爲 512M
-XX:MaxNewSize
-XX:MaxNewSize 設置年輕代的最大內存;
-XX:MaxNewSize=512m # 設置年輕代的最大內存爲 512M
-XX:PermSize
JDK1.8取消了PermGen,取而代之的是Metaspace,所以PermSize和MaxPermSize參數失效,取而代之的是-XX:MetaspaceSize -XX:MaxMetaspaceSize
-XX:PermSize 設置老年代的初始內存
-XX:PermSize=64M # 設置老年代的初始內存爲 64M
-XX:MaxPermSize
JDK1.8取消了PermGen,取而代之的是Metaspace,所以PermSize和MaxPermSize參數失效,取而代之的是-XX:MetaspaceSize -XX:MaxMetaspaceSize
-XX:MaxPermSize 設置老年代的最大內存
-XX:MaxPermSize=64M # 設置老年代的最大內存爲 64M
-XX:MetaspaceSize
-XX:MaxMetaspaceSize
-Xnoclassgc
3.2 編譯優化相關的
-Xss
ss: stack size,設置每個線程的棧大小,單位:k(K)、m(M)、g(G)。
JDK5.0 以後每個線程棧大小爲 1M,之前每個線程棧大小爲 256K。
在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
需要注意的是:當這個值被設置的較大時(例如 > 2MB)將會在很大程度上降低系統的性能。
這個選項和 -XX:ThreadStackSize 相同。
-Xss128k // 設置線程棧大小爲128K
-Xbatch
-Xmixed
-Xint
-Xcomp
-Xmaxjitcodesize=size
3.3 調試監控
-Xloggc
把 GC 信息輸出到文件中,和 verbose:gc 的內容是一樣的。
如果這兩個命令一起使用的話,Xloggc 會覆蓋 verbose:gc 命令。
-Xloggc:garbage-collection.log // 將 GC 信息輸出到 garbage-collection.log 文件中
-Xprof
-Xdiag
-Xdebug
-Xcheck:jni
-Xfuture
-Xverify:mode
3.4 其他
-X
-Xbootclasspath:path
-Xbootclasspath/a:path
-Xbootclasspath/p:path
-Xinternalversion
-Xrs
-Xshare:mode
-XshowSettings:category
-javaagent:[=<選項>]
加載 Java 代理, 請參閱 java.lang.instrument
-javaagent:/usr/local/eclipse/lombok.jar # 加載 Java 代理 lombok.jar 包
java.lang.instrument使用
Instrumentation 新功能
技術問答集錦(13)Java Instrument原理
深入理解Instrument(一)
4. 非 stable 參數(-XX)
-XX:GCTimeRatio=n
設置垃圾收集時間佔程序運行時間的百分比,默認值爲 99,就是允許最大 1/100 的垃圾收集時間。公式爲1/(1+n)
-XX:GCTimeRatio=99 // 設置垃圾收集佔程序總運行時間的比例爲 1/100
JVM參數配置詳解(包含JDK1.8)
《深入理解Java虛擬機_第2版》3.5.3 Parallel Scavenge 收集器
-XX:MaxGCPauseMills
該參數主要用於 Parallel Scavenge 收集器,由於Parallel Scavenge 收集器爲新生代收集器,所以該參數主要用於設置新生代垃圾收集最大暫停時間,即新生代最大垃圾收集時間不超過該值,單位爲 ms
-XX:MaxGCPauseMillis=100 // 設置新生代垃圾收集最大暫停時間爲 100ms
JVM參數配置詳解(包含JDK1.8)
《深入理解Java虛擬機_第2版》3.5.3 Parallel Scavenge 收集器
-XX:MaxTenuringThreshold
對象晉升到老年代的年齡閾值
-XX:PretenureSizeThreshold=1 // 設置對象晉升到老年代的年齡閾值爲 1
《深入理解Java虛擬機_第2版》3.6.3 長期存活的對象將進入老年代
-XX:ParallelGCThreads
設置並行GC時進行內存回收的線程數
-XX:ParallelGCThreads=8 // 設置並行GC時進行內存回收的線程數
-XX:PretenureSizeThreshold
設置對象進入老年代的大小閾值,大於這個值的對象直接在老年代分配,單位必須爲字節
-XX:PretenureSizeThreshold=3145728 // 大於 3145728 的對象將直接在老年代進行分配
《深入理解Java虛擬機_第2版》3.6.2 大對象直接進入老年代
-XX:+PrintGCDetails
打印虛擬機內存回收日誌
-XX:+PrintGCDetails // 打印虛擬機內存回收日誌
-XX:SurvivorRatio
新生代中 Eden 區域與 Survivor 區域的容量比值,默認爲 8,代表 Eden:Survivor=8:1。
-XX:SurvivorRatio=8 // Eden 區域與 Survivor 區域的比值,Eden:Survivor=8:1
-XX:UseAdaptiveSizePolicy
設置虛擬機使用 GC 自適應的調節策略,使用該參數之後,將不再需要設置 -Xmn、-XX:SurvivorRatio、-XX:PretenureSizeThreshold 等細節參數,虛擬機會根據當前系統的運行情況收集性能監控信息,動態調整這些參數以提供最合適的停頓時間或最大的吞吐量。
-XX:UseAdaptiveSizePolicy // 設置 JVM 使用 GC 自適應的調節策略
JVM參數配置詳解(包含JDK1.8)
《深入理解Java虛擬機_第2版》3.5.3 Parallel Scavenge 收集器
-XX:+UseSerialGC
虛擬機運行在Client模式下的默認值,打開此開關後,使用 Serial + Serial Old 的收集器組合進行內存回收
-XX:+TraceClassLoading
跟蹤顯示類加載的過程
-XX:+TraceClassLoading // 跟蹤顯示類加載的過程
-XX:MetaspaceSize
-XX:MaxMetaspaceSize
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+UseConcMarkSweepGC
-XX:-DisableExplicitGC
禁止調用System.gc();但jvm的gc仍然有效
-XX:+MaxFDLimit
最大化文件描述符的數量限制
-XX:+ScavengeBeforeFullGC
新生代GC優先於Full GC執行
-XX:+UseGCOverheadLimit
在拋出OOM之前限制jvm耗費在GC上的時間比例
-XX:-UseConcMarkSweepGC
對老生代採用併發標記交換算法進行GC
-XX:-UseParallelGC
啓用並行GC
-XX:-UseParallelOldGC
對Full GC啓用並行,當-XX:-UseParallelGC啓用時該項自動啓用
-XX:-UseSerialGC
啓用串行GC
-XX:+UseThreadPriorities
啓用本地線程優先級
-XX:LargePageSizeInBytes=4m
設置用於Java堆的大頁面尺寸
-XX:MaxHeapFreeRatio=70描述
GC後java堆中空閒量佔的最大比例
-XX:MinHeapFreeRatio=40
GC後java堆中空閒量佔的最小比例
-XX:NewRatio=2
新生代內存容量與老生代內存容量的比例
-XX:ReservedCodeCacheSize=32m
保留代碼佔用的內存容量
-XX:ThreadStackSize=512
設置線程棧大小,若爲0則使用系統默認值
-XX:+UseLargePages
使用大頁面內存
-XX:HeapDumpPath=./java_pid.hprof
指定導出堆信息時的路徑或文件名
-XX:-HeapDumpOnOutOfMemoryError
當首次遭遇OOM時導出此時堆中相關信息
-XX:-PrintConcurrentLocks
遇到Ctrl-Break後打印併發鎖的相關信息,與jstack -l功能相同
-XX:-TraceClassLoading
跟蹤類的加載信息
-XX:OnError=";"
出現致命ERROR之後運行自定義命令
參考文檔
JVM虛擬機參數查詢
java–jvm啓動的參數
Java運行參數設置
JVM參數配置詳解(包含JDK1.8)
《深入理解Java虛擬機_第2版》3.5.9 垃圾收集器參數總結