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 :目錄和 zip/jar 文件的類搜索路徑
-classpath: 目錄和 zip/jar 文件的類搜索路徑。 用 : 分隔的目錄, JAR 檔案
和 ZIP 檔案列表, 用於搜索類文件。
2.3 運行調試相關的
(1)verbose
-verbose:class
在程序運行的時候究竟會有多少類被加載呢,一個簡單程序會加載上百個類的!你可以用verbose:class來監視,在命令行輸入java -verbose:class XXX (XXX為程序名)你會在控制台看到加載的類的情況。
verbose和verbose:class含義相同,輸出虛擬機裝入的類的信息,顯示的信息格式如下: [Loaded java.io.FilePermission$1 from shared objects file] 當虛擬機報告類找不到或類沖突時可用此參數來診斷來查看虛擬機從裝入類的情況。
–verbose:gc
在虛擬機發生內存回收時在輸出設備顯示信息,格式如下: [Full GC 268K->168K(1984K), 0.0187390 secs] 該參數用來監視虛擬機內存回收的情況。
java –verbose:jni
-verbose:jni輸出native方法調用的相關情況,一般用於診斷jni調用錯誤信息。
斷言
Java斷言默認是不啟用的.在運行時,是需要顯式開啟才能生效,否則斷言沒有任何意義
開啟斷言:-ea
關閉斷言:不指定-ea參數,或是加上-da
另外,斷言可以開啟局部斷言,格式如下:
-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
1
2
3
4
5
6
7
8
9
10
當開始斷言后,在程序中的如下代碼就會生效:
assert <布爾表達式>
assert <布爾表達式> : <錯誤信息>
1
2
2.4 設置系統變量的-D參數
格式:-D<name>=<value>
作用:配置一些環境變量,具體有哪些參數,參數有什么效果,和你用的實際環境、項目架構都有關
示例:
public class TestDPara {
public static void main(String[] args) {
String value= System.getProperty("key1");
System.out.println(value);
}
}
1
2
3
4
5
6
7
8
運行程序:java -Dkey1=sdfdsfdsfdsfsd TestDPara
另外,一些標准的Property列表如下:
key value
“file.separator” Character that separates components of a file path. This is “/” on UNIX
“java.class.path” Path used to find directories and JAR archives containing class files.
“java.home” Installation directory for Java Runtime Environment (JRE)
“java.vendor” JRE vendor name
“java.vendor.url” JRE vender URL
“java.version” JRE version number
“line.separator” Sequence used by operating system to separate lines in text files
“os.arch” Operating system architecture
“os.name” Operating system name
“os.version” Operating system version
“path.separator” Path separator character used in java.class.path
“user.dir” User working directory
“user.home” User home directory
“user.name” User account name
3. 非標准參數(-X)
常用的-X 參數包括堆棧配置的、監控相關的
3.1 堆棧配置、垃圾回收
(1)-Xmnsize :設置初始和最大的年輕代大小。可以指定單位k(K),m(M),g(G) .年輕代存儲新創建的對象,這個區域的垃圾回收的頻率要比其他區域
高的多。如果這個區域太小了,那么垃圾回收的次數就會太多,如果太大了,垃圾回收就會浪費更多的時間。oracle建議年輕代的大小是
堆總大小的四分之一到二分之一之間。下面的例子展示了怎么設置年輕代的大小為256m:
-Xmn256m
-Xmn262144k
-Xmn268435456
我們還可以通過其他兩個選項來代替這個選項來指定年輕代最小和最大內存: -XX:NewSize 指定初始化大小。 -XX:MaxNewSize:指定最大內存。
(2)-Xmssize :設置初始化堆內存大小,這個值的大小必須是1024的倍數,並且大於1M, 可以指定單位k(K),m(M),g(G)。下面的例子把堆的初始化大小
設置成6M。
-Xms6291456
-Xms6144k
-Xms6m
如果沒有設置這個值,那么它的初始化大小就是年輕大和老年代的和。年輕代初始化大小可以通過-Xmn和-XX:NewSize 選項來指定。
(3)-Xmxsize :設置最大堆內存大小,這個值的大小必須是1024的倍數,並且大於2M,可以指定單位k(K),m(M),g(G)。默認值是根據運行時的系統配置來確定的。
一般服務器部署時,把-Xms和-Xmx的值設置成相同的大小。下面的例子把堆最大內存設置成80M
-Xmx83886080
-Xmx81920k
-Xmx80m
1
2
3
-Xmx選項和-XX:MaxHeapSize相同。
(4)-Xnoclassgc :禁止類的垃圾回收,這個以節省一些GC時間,縮短應用運行時的中斷時間。 當設置了這個選項的時候,類對象在GC時不會受到任何影響,它會被認為是一直存活的。這就使得更多的內存是永久保留的。如果使用不慎的話就會導致內存溢出的異常。
3.2 編譯優化相關的
(1)-Xbatch :禁止后台編譯,默認JVM編譯方法都是作為一個后台任務,編譯完成后解釋執行。使用此選項禁用后台編譯,在前台編譯完成后執行。
(2)-Xmixed :使用混合模式運行代碼:解釋模式和編譯模式
(3)-Xint :僅僅使用解釋模式執行方法,編譯成本地方法的功能被禁用,JIT編譯帶來的好處將不復存在。
(4)-Xcomp :你可以指定在編譯之前需要解釋執行的次數。使用XX:CompileThreshold選項。
(5)-Xmaxjitcodesize=size :指定JIT編譯代碼的最大緩存,單位是字節。 也可以指定單位k(K)或m(M)。默認的最大緩存是240M。如果禁止分層編譯的話,
默認大小就是48M。-Xmaxjitcodesize=240m。這個選項和-XX:ReservedCodeCacheSize類似。
-Xsssize :設置線程棧的大小。可以指定單位k(K),m(M),g(G)。默認值根據內存而定。
下面的例子指定棧大小為1024KB:
-Xss1m
-Xss1024k
-Xss1048576
這個選項和-XX:ThreadStackSize相同。
3.3 調試、 監控
(1)-Xprof :在程序的運行過程中輸出性能分析數據,這個選項一般作為開發過程中,不建議在生產環境中使用。
(2)-Xloggc:filename :把GC信息輸出到文件中,和verbose:gc的內容是一樣的。如果這兩個命令一起使用的話,Xloggc會覆蓋verbose命令。
比如:-Xloggc:garbage-collection.log
(3)-Xdiag :顯示額外的診斷信息
(4)-Xdebug :提供向后兼容的能力。
(5)-Xcheck:jni :對java本地接口方法添加額外的檢查,在處理JNI請求之前會檢查傳遞的參數和運行時環境數據。任何會產生問題的本地代碼都會終止JVM。 使用這個選項會降低性能。
(6)-Xfuture :強制檢查類文件格式,開發者被鼓勵在開發時使用這個選項,因為在未來的版本中這個嚴格的檢查會成為默認選項。
(7)-Xverify:mode :設置字節碼驗證模式。字節碼驗證可以幫助我們找到一些問題。mode的參數如下:
none:不進行驗證。這回節省應用啟動時間,同時也減少了java提供的保護。
remote:驗證那些不是被引導類加載器加載的類。這是默認的設置。
all:驗證所有的類。
1
2
3
3.4 其他
-X :展示出所有可用的-X選項
-Xbootclasspath:path :指定一系列用分號分開的目錄、jar、或者zip文件,從中搜索引導類文件,這些文件都包含在JDK中。 不要在部署應用的時候使用這個選項覆蓋rt.jar中的類,因為這違反JRE規范。
-Xbootclasspath/a:path :在引導類路徑的結尾指定一系列用分號分開的目錄、jar、或者zip文件,從中搜索引導類文件。 不要在部署應用的時候使用這個選項覆蓋rt.jar中的類,因為這違反JRE規范。
-Xbootclasspath/p:path :在引導類路徑之前指定一系列用分號分開的目錄、jar、或者zip文件,從中搜索引導類文件。
不要在部署應用的時候使用這個選項覆蓋rt.jar中的類,因為這違反JRE規范。
-Xinternalversion :比-version命令展示更多的JVM版本信息,然后退出。
-Xrs :減少JVM使用的操作系統信號。 關閉鈎子使得java應用通過執行用戶的清理代碼來循序的關閉(比如數據庫連接),盡管JVM圖鑒終止。 JVM監控控制台,通過關閉鈎子來防止意外終止。 通常,JVM注冊一個控制台處理程序,它會開始關閉鈎子並返回TURE,當遇到CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, and CTRL_SHUTDOWN_EVENT。JVM使用相同的原理來實現線程棧的備份已達到調試的目的。JVM使用CTRL_BREAK_EVENT 來保證線程棧備份。
如果JVM作為一個服務(比如:文本服務的servlet引擎),它可以接受CTRL_LOGOFF_EVENT,但是不會開始關閉,因為操作系統不會終止這個進程。
我們可以使用-Xrs來避免這種情況,當使用這個選項的時候,JVM不會注冊控制台處理程序,也就意味着不會監控CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, or CTRL_SHUTDOWN_EVENT.這些事件。
使用這個選項會導致兩個后果:
(1)Ctrl + Break 線程棧備份不再起作用
(2)用戶代碼必須為關閉鈎子而負責,比如:當JVM終止的時候調用System.exit()。
-Xshare:mode :設置類數據共享(CDS)模式。可能得mode參數如下:
auto:如果可能就是用CDS,這是32位 client模式JVM的默認值。
on:開啟類數據共享。如果某個類共享不可用,那么將打印錯誤並退出。
off:關閉類共享。這是32位 server模式JVM、64位JVM的默認設置。
dump:手動生成CSD文檔,你將為每一個新的JDK版本重新生成CDS文檔。
1
2
3
4
-XshowSettings:category :查看設置。可能的category參數如下。
all:所有的設置,這是默認值。
locale:本地設置。
properties:系統屬性設置。
vm:JVM設置。
1
2
3
4
4. 非Stable參數(-XX)
原文地址:https://www.cnblogs.com/w-wfy/p/6415856.html
4.1 相關相關的(主要是gc算法)
參數及其默認值 描述
-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 啟用本地線程優先級
4.2 性能調優參數列表
參數及其默認值 描述
-XX:LargePageSizeInBytes=4m 設置用於Java堆的大頁面尺寸
-XX:MaxHeapFreeRatio=70描述 GC后java堆中空閑量占的最大比例
-XX:MaxNewSize=size 新生成對象能占用內存的最大值
-XX:MaxPermSize=64m 老生代對象能占用內存的最大值
-XX:MinHeapFreeRatio=40 GC后java堆中空閑量占的最小比例
-XX:NewRatio=2 新生代內存容量與老生代內存容量的比例
-XX:NewSize=2.125m 新生代對象生成時占用內存的默認值
-XX:ReservedCodeCacheSize=32m 保留代碼占用的內存容量
-XX:ThreadStackSize=512 設置線程棧大小,若為0則使用系統默認值
-XX:+UseLargePages 使用大頁面內存
4.3 調試參數列表
參數及其默認值 描述
-XX:HeapDumpPath=./java_pid.hprof 指定導出堆信息時的路徑或文件名
-XX:-HeapDumpOnOutOfMemoryError 當首次遭遇OOM時導出此時堆中相關信息
-XX:-PrintConcurrentLocks 遇到Ctrl-Break后打印並發鎖的相關信息,與jstack -l功能相同
-XX:-TraceClassLoading 跟蹤類的加載信息
-XX:OnError=";" 出現致命ERROR之后運行自定義命令
附錄:Java程序支持的所有運行參數列表
Java程序支持的所有運行參數列表如下:
C:\Users\dan>java
用法: java [-options] class [args...]
(執行類)
或 java [-options] -jar jarfile [args...]
(執行 jar 文件)
其中選項包括:
-d32 使用 32 位數據模型 (如果可用)
-d64 使用 64 位數據模型 (如果可用)
-server 選擇 "server" VM
默認 VM 是 server.
-cp <目錄和 zip/jar 文件的類搜索路徑>
-classpath <目錄和 zip/jar 文件的類搜索路徑>
用 ; 分隔的目錄, JAR 檔案
和 ZIP 檔案列表, 用於搜索類文件。
-D<名稱>=<值>
設置系統屬性
-verbose:[class|gc|jni]
啟用詳細輸出
-version 輸出產品版本並退出
-version:<值>
警告: 此功能已過時, 將在
未來發行版中刪除。
需要指定的版本才能運行
-showversion 輸出產品版本並繼續
-jre-restrict-search | -no-jre-restrict-search
警告: 此功能已過時, 將在
未來發行版中刪除。
在版本搜索中包括/排除用戶專用 JRE
-? -help 輸出此幫助消息
-X 輸出非標准選項的幫助
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
按指定的粒度啟用斷言
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
禁用具有指定粒度的斷言
-esa | -enablesystemassertions
啟用系統斷言
-dsa | -disablesystemassertions
禁用系統斷言
-agentlib:<libname>[=<選項>]
加載本機代理庫 <libname>, 例如 -agentlib:hprof
另請參閱 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<選項>]
按完整路徑名加載本機代理庫
-javaagent:<jarpath>[=<選項>]
加載 Java 編程語言代理, 請參閱 java.lang.instrument
-splash:<imagepath>
使用指定的圖像顯示啟動屏幕
有關詳細信息, 請參閱 http://www.oracle.com/technetwork/java/javase/documentation
/index.html。
C:\Users\dan>