Posted on 2007-08-16 13:39 朱遠翔-Apusic技術支持工程師 閱讀(426) 評論(0)  編輯 收藏 引用 所屬分類: Java世界

1.1格式

java[jvmargs]class[arguments]

1.2標準參數

1.-server

-client

虛擬機服務器模式/客戶機模式,使用server模式可以提高性能,啟動比client模式慢,長期運行則比client模式快。當該參數不指定時,虛擬機啟動檢測主機是否為服務器,如果是則以server模式啟動,否則以client模式啟動,J2SE5.0檢測的根據是至少2CPU和最低2GB內存。(編者注:使用server模式啟動必須使用JDK,但是對于機器好像沒有這個要求)

2.-agentlib:<lib-name>=<options>

-agentpath:<lib-path>=<options>

本地類庫加載,當你的部分類包含一些本地方法時,需要自己編寫本地代碼并位于操作系統加載共享包(dll)的路徑上,如果你不喜歡將該包放在操作系統識別的加載上,則可以通過指定這個參數來加載自己的本地共享包(dll)。不同之處在于-agentlib中僅指定包名,根據操作系統的不同虛擬機在一定路徑上搜索該包,譬如對于windows平臺虛擬機在PATH路徑上搜索該包,而lib-path則是指定全路徑,例如

-agentlib:hprofwindows平臺虛擬機會在啟動時到PATH路徑上搜索hprof.dll并加載

虛擬機在加載代理包之后有一個啟動的操作(詳細參見JDK參考),<options>指的是代理包的啟動參數

3.-classpathclasspath

-cclasspath

指定類路徑,系統應用類加載器(ClassLoader)會到該路徑下加載類

4.-Dproperty=value

設置系統屬性,可以通過System.getProperty(property)獲得

5.-enableassertions[:<packagename>"..."|:<classname>]

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

-disableassertions[:<packagename>"..."|:<class;]

-da[:<packagename>"..."|:<classname>]

啟用和停用斷言,默認是停用斷言。斷言指的是從JDK1.4開始在支持的關鍵字assertassert(booleanvalue),當booleanvaluefalse時,拋出java.lang.AssertionError,必須指出的是,代碼編譯必須是1.4及其以上順從的,即編譯時使用如下參數

java-source1.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中必須包含有靜態方法

publicstaticvoidpremain(StringagentArgs,Instrumentationinst){...}

上面的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

顯示非標準參數(見下面介紹)并退出

1.3非標準參數(以-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開始引入。

SUNJ2SE1.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不再監測控制臺事件。