






1.1 格式
java [jvmargs] class [arguments]
1.2 標準參數(shù)
1.-server
-client
虛擬機服務器模式/客戶機模式,使用server模式可以提高性能,啟動比client模式慢,長期運行則比client模式快。當該參數(shù)不指定時,虛擬機啟動檢測主機是否為服務器,如果是則以server模式啟動,否則以client模式啟動,J2SE5.0檢測的根據是至少2個CPU和最低2GB內存
2.-agentlib:<lib-name>=<options>
-agentpath:<lib-path>=<options>
本地類庫加載,當你的部分類包含一些本地方法時,需要自己編寫本地代碼并位于操作系統(tǒng)加載共享包(dll)的路徑上,如果你不喜歡將該包放在操作系統(tǒng)識別的加載上,則可以通過指定這個參數(shù)來加載自己的本地共享包(dll)。不同之處在于-agentlib中僅指定包名,根據操作系統(tǒng)的不同虛擬機在一定路徑上搜索該包,譬如對于windows平臺虛擬機在PATH路徑上搜索該包,而lib-path則是指定全路徑,例如
-agentlib:hprof 在windows平臺虛擬機會在啟動時到PATH路徑上搜索hprof.dll并加載
虛擬機在加載代理包之后有一個啟動的操作(詳細參見JDK參考),<options>指的是代理包的啟動參數(shù)
3.-classpath classpath
-c classpath
指定類路徑,系統(tǒng)應用類加載器(ClassLoader)會到該路徑下加載類
4.-Dproperty=value
設置系統(tǒng)屬性,可以通過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及其以上順從的,即編譯時使用如下參數(shù)
java -source 1.4
一般僅在開發(fā)階段啟用斷言,而在運行階段不使用
其使用包括如下幾種情況
java -ea//啟動斷言
java -ea:pkname... //在包pkname及其子包下起用斷言
java -ea:pkname.classname //對類 pkname.classname啟用斷言
停用斷言與啟用設置類似
6.-enablesystemassertions
-esa
-disablesystemassertions
-dsa
啟用和停用系統(tǒng)類斷言
7.-jar
運行包含在一個jar包里的程序,一般在jar包的/META-INF/MANIFEST.MF文件中指定Main-Class值為要運行的主函數(shù),譬如 Main-Class:ayufox.ejb3.Test
8.-javaagent:<classname>[<=options>]
加載java語言代理,該功能是JDK5新增加的,可以通過該設置在JVM運行主函數(shù)(main)之前做一些預處理工作,其中classname中必須包含有靜態(tài)方法
public static void premain(String agentArgs, Instrumentation inst) { ... }
上面的options即是傳入該函數(shù)的代理參數(shù)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
顯示非標準參數(shù)(見下面介紹)并退出
1.3 非標準參數(shù)(以-X開頭)
1.-Xint
所有字節(jié)碼以解析模式運行。第一代虛擬機即是以這種方式運行,由于需要Java解析器解析運行,所以效率比較低;第二代虛擬機則采用將字節(jié)碼編譯成本地代碼的方式,效率大大提高;第三代虛擬機也叫自適應(HotSpot)虛擬機,通過監(jiān)測代碼的執(zhí)行情況檢測出代碼被頻繁執(zhí)行的部分,將其盡量優(yōu)化成本地代碼方式運行,而對于普通部分,則采用解析的模式運行。
2.-Xbatch
禁止后臺編譯,一般HotSpot虛擬機在檢測到一段代碼為頻繁執(zhí)行代碼需要將其編譯成本地代碼時,會啟動一個后臺線程完成這個工作,而同時采用解析的方式繼續(xù)運行字節(jié)碼。如果設置了該參數(shù),則會停止繼續(xù)執(zhí)行字節(jié)碼,先將其編譯成本地代碼,然后再繼續(xù)執(zhí)行。
3.-Xdebug
-Xnoagent
-Xrun
-Xrunjdwp
啟用調試模式,見前面的《利用JPDA構建調試平臺》這篇文章,后面將在一個獨立的文章中詳細介紹
4.-Xbootclasspath:bootclasspath
-Xbootclasspath/a:path
-Xbootclasspath/p:path
設置啟動根Classpath,即使啟動類加載器將在何處加載對象,關于類啟動加載器,參見《JVM類加載器體系結構》說明,分號后面的值指定路徑,以分號隔開。其區(qū)別在于,-Xbootclasspath:bootclasspath將新的根加載路徑覆蓋默認的路徑(\jre\lib\rt.jar),-Xbootclasspath/a:path將新的根加載路徑和原有的根加載路徑相結合,-Xbootclaspath/p:path將新的根加載路徑與原有的根加載路徑相結合,加載類時優(yōu)先搜索該加載路徑
5.-Xcheck:jni
對本地調用(JNI)采用更嚴格的檢測方式,在進行JNI調用之前檢測數(shù)據和傳入參數(shù),如果碰到不合法的數(shù)據則強制結束掉虛擬機,對運行性能有損害
6.-Xfuture
對類格式(class文件格式)采用更嚴格的檢測方式,以便向后兼容,最好在開發(fā)時采用該參數(shù)
7.-Xnoclassgc
不使用回收裝載類的內存(轉貼備注:按原文修改)
8.-Xloggc:file
與-verbose:gc功能一樣,不同在于-Xloggc:file將信息記錄到一個文件,而-verbose:gc將其輸出到控制臺
9.-Xincgc
-Xmsn
-Xmxn
-Xssn
跟內存分配和垃圾回收相關,-Xincgc表示采用漸進式垃圾回收,-Xmsn設置初始內存池大小,-Xmxn表示內存池允許的最大大小,-Xssn是線程棧大小,n是要設置的值,必須是1024的倍數(shù),譬如
-Xms6291456 -Xmx83886080
-Xms6144k -Xmx81920k
-Xms6m -Xmx80m
該部分對虛擬機的性能非常重要,在后面將有獨立的篇章詳細介紹
10.-Xprof
-Xrunhprof[:help][:<suboption>=<value>,...]
在運行時剖析運行情況,并將剖析結果打印到控制臺,其中后一個可以指定特定剖析對象,譬如cpu,堆(heap)等,可以運行java -Xrunhprof:help獲得可以剖析的對象和取值
11.-Xrs
減少JVM對操作系統(tǒng)信號量的使用,J2SE1.3.1開始引入。
SUN在J2SE1.3.0中增加了Java應用程序關閉時的回調鉤子(Hook),以便當JVM意外終止時用戶可以做一些資源清除工作。JVM監(jiān)視控制臺事件以實現(xiàn)JVM意外終止時的回調。JVM明確地注冊了一個控制臺控制處理器,當JVM接收到CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, 或CTRL_SHUTDOWN事件時,該處理器介入關閉回掉鉤子(HOOK)的處理。
如果虛擬機以服務的方式運行(譬如WEB服務器)當其收到CTRL_LOGOFF_EVENT事件,由于系統(tǒng)并不會因此終止JVM進程,故JVM不可以進行終止的操作,然而這與如上產生了沖突(不結束卻又調用關閉回調鉤子),為了避免這個問題,從J2SE1.3.1使用-Xrs以使JVM不再監(jiān)測控制臺事件。
參考:JDK5.0參考文檔http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/java.html