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