一、標準參數
1.-server
-client
虛擬機器伺服器模式/客戶機模式,使用server模式可以提高效能,啟動比client模式慢,長期運行則比client模式快。當該
參數不指定時,虛擬機器啟動檢測主機是否為伺服器,如果是則以server模式啟動,否則以client模式啟動,J2SE5.0檢測的根據是至少2個CPU和最低2GB記憶體
2.-agentlib:<lib-name>=<options>
-agentpath:<lib-path>=<options>
本地類庫載入,當你的部分類包含一些本地方法時,需要自己編寫本地代碼並位於作業系統載入共用包(dll)的路徑上,如果你不喜歡將該包放在作業系統識別的載入上,則可以通過指定這個
參數來載入自己的本地共用包(dll)。不同之處在於-agentlib中僅指定包名,根據作業系統的不同虛擬機器在一定路徑上搜尋該包,譬如對於windows平台虛擬機器在PATH路徑上搜尋該包,而lib-path則是指定全路徑,例如
-agentlib:hprof 在windows平台虛擬機器會在啟動時到PATH路徑上搜尋hprof.dll並載入
虛擬機器在載入代理包之後有一個啟動的操作(詳細參見JDK參考),<options>指的是代理包的啟動
參數
3.-classpath classpath
-c classpath
指定類路徑,系統應用類載入器(ClassLoader)會到該路徑下載入類
4.-Dproperty=value
設定系統屬性,可以通過System.getProperty(property)獲得
5.-enableassertions[:<package name>"..." | :<class name> ]
-ea[:<package name>"..." | :<class name> ]
-disableassertions[:<package name>"..." | :<class ; ]
-da[:<package name>"..." | :<class name> ]
啟用和停用斷言,預設是停用斷言。斷言指的是從JDK1.4開始在支援的關鍵字assert,assert(booleanvalue),當booleanvalue為false時,拋出java.lang.AssertionError,必須指出的是,代碼編譯必須是1.4及其以上順從的,即編譯時間使用如下
參數
java -source 1.4
一般僅在開發階段啟用斷言,而在運行階段不使用
其使用包括如下幾種情況
java -ea //啟動斷言
java -ea:pkname... //在包pkname及其子包下起用斷言
java -ea:pkname.classname //對類 pkname.classname啟用斷言
停用斷言與啟用設定類似
6.-enablesystemassertions
-esa
-disablesystemassertions
-dsa
啟用和停用系統類別斷言
7.-jar
運行包含在一個jar包裡的程式,一般在jar包的/META-INF/MANIFEST.MF檔案中指定Main-Class值為要啟動並執行主函數,譬如 Main-Class:ayufox.ejb3.Test
8.-javaagent:<classname>[<=options>]
載入java語言代理,該功能是JDK5新增加的,可以通過該設定在
JVM運行主函數(main)之前做一些預先處理工作,其中classname中必須包含有靜態方法
public static void premain(String agentArgs, Instrumentation inst) { ... }
上面的options即是傳入該函數的代理
參數agentArgs,關於Instrumentation詳細參見包java.lang.instrument
9.-verbose
-verbose:class
-verbose:gc
-verbose:jni
在運行時
class:將類載入情況在控制台中列印出來
gc:將虛擬機器的記憶體回收事件資訊列印
jni:放本地方法調用資訊列印
-verbose與-verbose:class一樣
10.-version
-showversion
顯示版本資訊,不同在於第一種顯示版本後虛擬機器結束退出
11.-?
-help
顯示協助資訊並退出
12.-X
顯示非標準
參數(見下面介紹)並退出
二、非標準
參數(以-X開頭)
1.-Xint
所有位元組碼以解析模式運行。第一代虛擬機器即是以這種方式運行,由於需要Java解析器解析運行,所以效率比較低;第二代虛擬機器則採用將位元組碼編譯成本地代碼的方式,效率大大提高;第三代虛擬機器也叫自適應(HotSpot)虛擬機器,通過監測代碼的執行情況檢測出代碼被頻繁執行的部分,將其盡量最佳化成本地代碼方式運行,而對於普通部分,則採用解析的模式運行。
2.-Xbatch
禁止背景編譯,一般HotSpot虛擬機器在檢測到一段代碼為頻繁執行代碼需要將其編譯成本地代碼時,會啟動一個後台線程完成這個工作,而同時採用解析的方式繼續運行位元組碼。如果設定了該
參數,則會停止繼續執行位元組碼,先將其編譯成本地代碼,然後再繼續執行。
3.-Xdebug
-Xnoagent
-Xrun
-Xrunjdwp
啟用偵錯模式,見前面的《利用JPDA構建調試平台》這篇文章,後面將在一個獨立的文章中詳細介紹
4.-Xbootclasspath:bootclasspath
-Xbootclasspath/a:path
-Xbootclasspath/p:path
設定啟動根Classpath,即使啟動類載入器將在何處載入對象,關於類啟動載入器,參見《
JVM類載入器體繫結構》說明,分號後面的值指定路徑,以分號隔開。其區別在於,-Xbootclasspath:bootclasspath將新的根載入路徑覆蓋預設的路徑(/jre/lib/rt.jar),-Xbootclasspath/a:path將新的根載入路徑和原有的根載入路徑相結合,-Xbootclaspath/p:path將新的根載入路徑與原有的根載入路徑相結合,載入類時優先搜尋該載入路徑
5.-Xcheck:jni
對本地調用(JNI)採用更嚴格的檢測方式,在進行JNI調用之前檢測資料和傳入
參數,如果碰到不合法的資料則強制結束掉虛擬機器,對運行效能有損害
6.-Xfuture
對類格式(class檔案格式)採用更嚴格的檢測方式,以便向後相容,最好在開發時採用該
參數
7.-Xnoclassgc
不使用記憶體回收
8.-Xloggc:file
與-verbose:gc功能一樣,不同在於-Xloggc:file將資訊記錄到一個檔案,而-verbose:gc將其輸出到控制台
9.-Xincgc
-Xmsn
-Xmxn
-Xssn
跟記憶體配置和記憶體回收相關,-Xincgc表示採用漸進式記憶體回收,-Xmsn設定初始記憶體池大小,-Xmxn表示記憶體池允許的最大大小,-Xssn是線程棧大小,n是要設定的值,必須是1024的倍數,譬如
-Xms6291456 -Xmx83886080
-Xms6144k -Xmx81920k
-Xms6m -Xmx80m
該部分對虛擬機器的效能非常重要,在後面將有獨立的篇章詳細介紹
10.-Xprof
-Xrunhprof[:help][:<suboption>=<value>,...]
在運行時剖析運行情況,並將剖析結果列印到控制台,其中後一個可以指定特定剖析對象,譬如cpu,堆(heap)等,可以運行java -Xrunhprof:help獲得可以剖析的對象和取值
11.-Xrs
減少
JVM對作業系統訊號量的使用,J2SE1.3.1開始引入。
SUN在J2SE1.3.0中增加了Java應用程式關閉時的回調鉤子(Hook),以便當
JVM意外終止時使用者可以做一些資源清除工作。
JVM監視控制台事件以實現
JVM意外終止時的回調。
JVM明確地註冊了一個控制台控制處理器,當
JVM接收到CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, 或CTRL_SHUTDOWN事件時,該處理器介入關閉回掉鉤子(HOOK)的處理。
如果虛擬機器以服務的方式運行(譬如WEB伺服器)當其收到CTRL_LOGOFF_EVENT事件,由於系統並不會因此終止
JVM進程,故
JVM不可以進行終止的操作,然而這與如上產生了衝突(不結束卻又調用關閉回調鉤子),為了避免這個問題,從J2SE1.3.1使用-Xrs以使
JVM不再監測控制台事件。