JVM啟動(dòng)參數(shù)     CSDN Blog推出文章指數(shù)概念,文章指數(shù)是對(duì)Blog文章綜合評(píng)分后推算出的,綜合評(píng)分項(xiàng)分別是該文章的點(diǎn)擊量,回復(fù)次數(shù),被網(wǎng)摘收錄數(shù)量,文章長(zhǎng)度和文章類型;滿分100,每月更新一次。

 

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)鍵字assertassert(booleanvalue),當(dāng)booleanvaluefalse時(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開始引入。

  SUNJ2SE1.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