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模式啟動比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函數參數的合法性,在本地代碼中遇到非法資料時,虛擬機器將報一個致命錯誤而終止。使用該參數後將造成效能下降。