1. 程式人生 > >JVM 啟動引數詳解

JVM 啟動引數詳解

JAVA虛擬機器(JVM)通過作業系統命令JAVA_HOME\bin\java –option 來啟動,-option為虛擬機器引數,JAVA_HOME為JDK安裝路徑,通過這些引數可對虛擬機器的執行狀態進行調整,掌握引數的含義可對虛擬機器的執行模式有更深入的理解。
虛擬機器引數分為基本和擴充套件兩類,在命令列中輸入JAVA_HOME\bin\java 就可得到基本引數列表,
在命令列輸入JAVA_HOME\bin\java –X 就可得到擴充套件引數列表。

基本引數說明:

-client,-server
這兩個引數用於設定虛擬機器使用何種執行模式,client模式啟動比較快,但執行時效能和記憶體管理效率不如server模式,通常用於客戶端應用程式。相反,server模式啟動比client慢,但可獲得更高的執行效能。
在windows上,預設的虛擬機器型別為client模式,如果要使用server模式,就需要在啟動虛擬機器時加-server引數,以獲得更高效能,對伺服器端應用,推薦採用server模式,尤其是多個CPU的系統。在Linux,Solaris上預設採用server模式。


-hotspot
含義與client相同,jdk1.4以前使用的引數,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檔案。用System. getProperty("java.ext.dirs”)可得到虛擬機器使用Extension搜尋路徑。

User classes搜尋順序為當前目錄、環境變數 CLASSPATH、-classpath。

-classpath告知虛擬機器搜尋目錄名、jar文件名、zip文件名,之間用分號;分隔。

例如當你自己開發了公共類幷包裝成一個common.jar包,在使用common.jar中的類時,就需要用-classpath common.jar 告訴虛擬機器從common.jar中查詢該類,否則虛擬機器就會丟擲java.lang.NoClassDefFoundError異常,表明未找到類定義。

在執行時可用System.getProperty(“java.class.path”)得到虛擬機器查詢類的路徑。


使用-classpath後虛擬機器將不再使用CLASSPATH中的類搜尋路徑,如果-classpath和CLASSPATH都沒有設定,則虛擬機器使用當前路徑(.)作為類搜尋路徑。

推薦使用-classpath來定義虛擬機器要搜尋的類路徑,而不要使用環境變數CLASSPATH的搜尋路徑,以減少多個專案同時使用CLASSPATH時存在的潛在衝突。例如應用1要使用a1.0.jar中的類G,應用2要使用a2.0.jar中的類G,a2.0.jar是a1.0.jar的升級包,當a1.0.jar,a2.0.jar都在CLASSPATH中,虛擬機器搜尋到第一個包中的類G時就停止搜尋,如果應用1應用2的虛擬機器都從CLASSPATH中搜索,就會有一個應用得不到正確版本的類G。


-D<propertyName>=value

在虛擬機器的系統屬性中設定屬性名/值對,執行在此虛擬機器之上的應用程式可用System.getProperty(“propertyName”)得到value的值。
如果value中有空格,則需要用雙引號將該值括起來,如-Dname=”space string”。
該引數通常用於設定系統級全域性變數值,如配置檔案路徑,應為該屬性在程式中任何地方都可訪問。


-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錯誤時可為診斷提供便利。


-version
顯示可執行的虛擬機器版本資訊然後退出。一臺機器上裝有不同版本的JDK時


-showversion
顯示版本資訊以及幫助資訊。


-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]

從JDK1.4開始,java可支援斷言機制,用於診斷執行時問題。通常在測試階段使斷言有效,在正式執行時不需要執行斷言。斷言後的表示式的值是一個邏輯值,為true時斷言不執行,為false時斷言執行,丟擲java.lang.AssertionError錯誤。
上述引數就用來設定虛擬機器是否啟動斷言機制,預設時虛擬機器關閉斷言機制,用-ea可開啟斷言機制,不加<packagename>和classname時執行所有包和類中的斷言,如果希望只執行某些包或類中的斷言,可將包名或類名加到-ea之後。例如要啟動包com.foo.util中的斷言,可用命令 –ea:com.foo.util 。


-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
用來設定虛擬機器關閉斷言處理,packagename和classname的使用方法和-ea相同。


-esa | -enablesystemassertions
設定虛擬機器顯示系統類的斷言。


-dsa | -disablesystemassertions
設定虛擬機器關閉系統類的斷言。


-agentlib:<libname>[=<options>]
該引數是JDK5新引入的,用於虛擬機器裝載本地代理庫。

Libname為本地代理庫檔名,虛擬機器的搜尋路徑為環境變數PATH中的路徑,options為傳給本地庫啟動時的引數,多個引數之間用逗號分隔。在Windows平臺上虛擬機器搜尋本地庫名為libname.dll的檔案,在Unix上虛擬機器搜尋本地庫名為libname.so的檔案,搜尋路徑環境變數在不同系統上有所不同,Linux、SunOS、IRIX上為LD_LIBRARY_PATH,AIX上為LIBPATH,HP-UX上為SHLIB_PATH。

例如可使用-agentlib:hprof來獲取虛擬機器的執行情況,包括CPU、記憶體、執行緒等的執行資料,並可輸出到指定檔案中,可用-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方法。
參見:java.lang.instrument

擴充套件引數說明
-Xmixed
設定-client模式虛擬機器對使用頻率高的方式進行Just-In-Time編譯和執行,對其他方法使用解釋方式執行。該方式是虛擬機器預設模式。


-Xint
設定-client模式下執行的虛擬機器以解釋方式執行類的位元組碼,不將位元組碼編譯為本機碼。


-Xbootclasspath:path

-Xbootclasspath/a:path

-Xbootclasspath/p:path
改變虛擬機器裝載預設系統執行包rt.jar而從-Xbootclasspath中設定的搜尋路徑中裝載系統執行類。除非你自己能寫一個執行時,否則不會用到該引數。
/a:將在預設搜尋路徑後加上path 中的搜尋路徑。
/p:在預設搜尋路徑前先搜尋path中的搜尋路徑。


-Xnoclassgc
關閉虛擬機器對class的垃圾回收功能。


-Xincgc
啟動增量垃圾收集器,預設是關閉的。增量垃圾收集器能減少偶然發生的長時間的垃圾回收造成的暫停時間。但增量垃圾收集器和應用程式併發執行,因此會佔用部分CPU在應用程式上的功能。


-Xloggc:<file>
將虛擬機器每次垃圾回收的資訊寫到日誌檔案中,檔名由file指定,檔案格式是平檔案,內容和-verbose:gc輸出內容相同。


-Xbatch
虛擬機器的預設執行方式是在後臺編譯類程式碼,然後在前臺執行程式碼,使用-Xbatch引數將關閉虛擬機器後臺編譯,在前臺編譯完成後再執行。


-Xms<size>
設定虛擬機器可用記憶體堆的初始大小,預設單位為位元組,該大小為1024的整數倍並且要大於1MB,可用k(K)或m(M)為單位來設定較大的記憶體數。初始堆大小為2MB。
例如:-Xms6400K,-Xms256M


-Xmx<size>
設定虛擬機器記憶體堆的最大可用大小,預設單位為位元組。該值必須為1024整數倍,並且要大於2MB。可用k(K)或m(M)為單位來設定較大的記憶體數。預設堆最大值為64MB。
例如:-Xmx81920K,-Xmx80M
當應用程式申請了大記憶體執行時虛擬機器丟擲java.lang.OutOfMemoryError: Java heap space錯誤,就需要使用-Xmx設定較大的可用記憶體堆。


-Xss<size>
設定執行緒棧的大小,預設單位為位元組。與-Xmx類似,也可用K或M來設定較大的值。通常作業系統分配給執行緒棧的預設大小為1MB。
另外也可在java中建立執行緒物件時設定棧的大小,建構函式原型為Thread(ThreadGroup group, Runnable target, String name, long stackSize)。


-Xprof
輸出CPU執行時的診斷資訊。


-Xfuture
對類檔案進行嚴格格式檢查,以保證類程式碼符合類程式碼規範。為保持向後相容,虛擬機器預設不進行嚴格的格式檢查。


-Xrs
減少虛擬機器中作業系統的訊號(singals)的使用。該引數通常用在虛擬機器以後臺服務方式執行時使用(如Servlet)。


-Xcheck:jni
呼叫JNI函式時進行附加的檢查,特別地虛擬機器將校驗傳遞給JNI函式引數的合法性,在原生代碼中遇到非法資料時,虛擬機器將報一個致命錯誤而終止。使用該引數後將造成效能下降。