最近在找java命令行參數解析,翻到一篇排版較好的文章,遂轉載分享。
Java在運行已編譯完成的類時,是通過java虛擬機來裝載和執行的,java虛擬機通過操作系統命令JAVA_HOME"bin/"java -option
來啓動,option
爲虛擬機參數, JAVA_HOME
爲JDK安裝路徑,通過虛擬機參數可對虛擬機的運行狀態進行調整,掌握參數的含義可對虛擬機的運行模式有更深入的理解。
如何查看參數列表
虛擬機參數分爲基本和擴展兩類,在命令行中輸入JAVA_HOME"bin/"java
就可得到基本的參數列表,在命令行中輸入JAVA_HOME"bin/"java -X
就可以得到擴展參數列表。
基本參數說明
-client/-server
這兩個參數用於設置虛擬機使用何種運行模式,client
模式啓動比較快,但運行時性能和內存管理效率不如server
模式,通常用於客戶端應用程序。相反,server
模式啓動稍慢,但可獲得更高的運行性能。
在win上,缺省的虛擬機類型爲client
模式,如果要使用server
模式就需要在啓動虛擬機時加上-server
參數,以獲得更高性能。對服務器應用,推薦採用server
模式,尤其是多個cpu的系統。
在Linux,Solaris上缺省採用的是server
模式。
-hotspot
含義與client
相同,jdk1.4以前使用的參數,現在已經不再使用,取而代之的是client
。
-classpath/-cp
虛擬機在運行一個類時需要將其裝入內存,搜索類的方式和順序如下:
- Bootstrap classes
- Extension Classes
- User Classes
Bootstrap
中的路徑是虛擬機自帶的jar或zip文件,虛擬機首選搜索這些包文件,用下面這種方式可得到虛擬機搜索的路徑:
System.getProperty("sun.boot.class.path")
Extension
位於jre的lib/ext
目錄下的jar文件,虛擬機在搜索完Bootstrap後就搜索該目錄下的jar文件,用下面這種方式可得到虛擬機使用的Extension搜索路徑:
System.getProperty("java.ext.dirs")
User
類搜索順序爲:
-classpath
指定的路徑- 環境變量
CLASSPATH
- 當前目錄
在使用-classpath/-cp
時,多個目錄之間用分號分隔。推薦使用該命令來指定虛擬機要搜索的類路徑,而不是依賴環境變量,以減少多個項目同時使用環境變量時存在的潛在衝突(多版本庫)。
可在運行時通過下面的代碼獲取虛擬機查找類的路徑:
System.getProperty("java.class.path")
-D=value
在虛擬機的系統屬性中設置屬性名/值對,運行在此虛擬機上的應用程序可用:
System.getProperty("屬性名")
得到value的值。
如果value中有空格,則需要用雙引號將該值括起來,如:-Dname="kazaf f"
。
該參數通常用於設置系統級全局變量值,如配置文件路徑,保證該屬性在程序中任何地方都可訪問。
-verbose[:class|gc|jni]
在輸出設備上顯示虛擬機運行信息。 -verbose
和-verbose:class
含義相同,表示輸出虛擬機裝入的類的信息,格式如下:
[Loaded java.io.FilePermission$1 from shared objects file]
當虛擬機報告類找不到或類衝突時,用此參數來查看虛擬機裝入類的情況。
-verbose:gc
用於在虛擬機發生內存回收時在輸出設備上顯示信息,格式如下:
[Full GC 268K->168K(1984K), 0.0187390 secs]
-verbose:jni
用於在虛擬機調用native方法時在設備上輸出顯示信息,格式如下:
[Dynamic-linking native method HelloNative.sum ... JNI]
該參數用於監視虛擬機調用本地方法的情況,在發生jni錯誤時可以爲診斷提供便利。
-ea[:…|:]/-enableassertions[:…|:]
從jdk1.4開始,java可支持斷言機制,用於診斷運行時問題。通常在測試階段使斷言有效,在線上運行時不需要運行斷言。斷言後的表達式的值是一個邏輯值,爲true
時斷言不運行,爲false
時斷言拋出java.lang.AssertionError
錯誤。
這個參數就是用來設置虛擬機是否啓動斷言機制,缺省時虛擬機關閉斷言機制,用-ea
可打開斷言機制,不加packagename
和classname
表示運行所有包和類中的斷言,如果希望只是運行某些包或類中的斷言,可將包名或類名加到-ea
之後,例如:-ea:com.foo.util
。
-da[:…|:]/-disableassertions[:…|:]
用來設置虛擬機關閉斷言處理,用法與-ea
類似。
-esa/-enablessystemassertions
設置虛擬機開啓系統類的斷言。
-dsa/-disablesystemassertions
設置虛擬機關閉系統類的斷言。
-agentlib:[=]
該參數是jdk5新引入的,用於虛擬機裝載本地代理庫。其中libname
爲本地代理庫文件名,虛擬機的搜索路徑爲環境變量path
中的路徑,options
爲傳給本地庫啓動時的參數,多個參數之間用逗號分隔。
在win平臺中,虛擬機搜索本地庫後綴名名爲.dll
,在Unix上則爲.so
文件。例如可以用-agentlib:hprof
來獲取虛擬機的運行情況。可用-agentlib:hprof=help
來得到使用幫助列表(確保在win平臺下的jre的lib
目錄下存在hprof.dll
文件)。
-agentpath:[=]
設置虛擬機按全路徑裝載本地庫,不再搜索PATH
中的路徑,其他功能同-agentlib
。
-javaagent:[=]
虛擬機啓動時裝入java語言設備代理。jarpath
文件中的mainfest
文件必須有Agent-Class
屬性。代理類要實現
public static void premain(String agentArgs, Instrumentation inst)
方法。當虛擬機初始化時,將按照代理類的說明順序調用premain
方法。
擴展參數說明
-Xmixed
設置-client
模式虛擬機對使用頻率高的方法進行Just-In-Time
編譯和執行,對其他方法使用解釋方式執行,該方式是虛擬機缺省模式。
-Xint
設置-client
模式下運行的虛擬機以解釋方式執行類的字節碼,不將字節碼編譯爲本機碼。
-Xbootclasspath[/a|/p]:path
改變虛擬機裝載缺省系統運行包rt.jar
的路徑,從-Xbootclasspath
中設定的搜索路徑中裝載運行類。除非你自己能寫一個運行時,否則不會用到這個參數。
其中/a
將在缺省搜索路徑後加上path中的搜索路徑,而/p
在缺省路徑前先搜索path中的路徑。
-Xnoclassgc
關閉虛擬機對class的垃圾回收功能。
-Xincgc
啓動增量垃圾收集器,缺省是關閉的。增量垃圾收集器能減少偶爾發生的長時間的垃圾回收造成的暫停時間。但增量垃圾收集器和應用程序併發執行,因此會佔用部分CPU在應用程序上的功能。
-Xloggc:
將虛擬機每次垃圾回收的信息寫到日誌文件中,文件名由file
指定,內容和-verbose:gc
輸出內容相同。
-Xbatch
虛擬機的缺省運行方式是在後臺編譯類代碼,然後在前臺執行代碼,使用該參數將關閉虛擬機後臺編譯,在前臺編譯完成後再執行。
-Xms
設置虛擬機可用內存堆的初始大小,缺省單位爲字節。該大小爲1024的整數倍並且要大於1MB,可用k(K)或m(M)爲單位來設置較大的內存數。初始堆的大小爲2MB。例如:-Xms6400K
、-Xms256M
-Xmx
設置虛擬機內存堆的最大可用大小,缺省單位爲字節,缺省堆最大值爲64MB。該值必須爲1024整數倍並且要大於2MB,可用k(K)或m(M)爲單位來設置較大的內存數。
當應用程序申請了大內存,運行時虛擬機拋出java.lang.OutOfMemoryError: Java heap space
錯誤,就需要用改參數設置更大的內存數。
-Xss
設置線程棧的大小,缺省單位爲字節,通常操作系統分配給線程棧的缺省大小爲1MB。另外,也可以在java中創建線程對象時設置棧的大小,構造函數原型爲:
Thread(ThreadGroup group, Runnable target, String name, long stackSzie)
-Xprof
輸出CPU運行時的診斷信息。
-Xfuture
對類文件進行嚴格格式檢查,以保證類代碼符合類代碼規範。爲保證向後兼容,虛擬機缺省不進行嚴格的格式檢查。
-Xrs
減少虛擬機中操作系統的信號的使用。該參數通常在虛擬機以後臺服務方式運行時使用(如Serlet)。
-Xcheck:jni
對jni函數執行檢查。
-Xshare:off
不嘗試使用共享類的數據
-Xshare:auto
在可能的情況下使用共享類的數據,默認值。
-Xshare:on
要求使用共享類的數據,否則運行失敗。