前段時(shí)間系統(tǒng)升級(jí)時(shí)遭遇了OOM,具體解決過(guò)程見(jiàn) 遭遇OutOfMemoryError;
為了鞏固對(duì)于java啟動(dòng)各項(xiàng)參數(shù)的認(rèn)識(shí),決定將所有參數(shù)列舉出來(lái),并一一解釋,以便后查;
java啟動(dòng)參數(shù)共分為三類;
其一是標(biāo)準(zhǔn)參數(shù)(-),所有的JVM實(shí)現(xiàn)都必須實(shí)現(xiàn)這些參數(shù)的功能,而且向后兼容;
其二是非標(biāo)準(zhǔn)參數(shù)(-X),默認(rèn)jvm實(shí)現(xiàn)這些參數(shù)的功能,但是并不保證所有jvm實(shí)現(xiàn)都滿足,且不保證向后兼容;
其三是非Stable參數(shù)(-XX),此類參數(shù)各個(gè)jvm實(shí)現(xiàn)會(huì)有所不同,將來(lái)可能會(huì)隨時(shí)取消,需要慎重使用;
本文主要描述標(biāo)準(zhǔn)參數(shù)部分,剩下的兩個(gè)部分將會(huì)陸續(xù)推出;
標(biāo)準(zhǔn)參數(shù)列表如下:
-client
設(shè)置jvm使用client模式,特點(diǎn)是啟動(dòng)速度比較快,但運(yùn)行時(shí)性能和內(nèi)存管理效率不高,通常用于客戶端應(yīng)用程序或者PC應(yīng)用開(kāi)發(fā)和調(diào)試。
-server
設(shè)置jvm使server模式,特點(diǎn)是啟動(dòng)速度比較慢,但運(yùn)行時(shí)性能和內(nèi)存管理效率很高,適用于生產(chǎn)環(huán)境。在具有64位能力的jdk環(huán)境下將默認(rèn)啟用該模式,而忽略-client參數(shù)。
-agentlib:libname[=options]
用于裝載本地lib包;
其中l(wèi)ibname為本地代理庫(kù)文件名,默認(rèn)搜索路徑為環(huán)境變量PATH中的路徑,options為傳給本地庫(kù)啟動(dòng)時(shí)的參數(shù),多個(gè)參數(shù)之間用逗號(hào)分隔。在Windows平臺(tái)上jvm搜索本地庫(kù)名為libname.dll的文件,在linux上jvm搜索本地庫(kù)名為libname.so的文件,搜索路徑環(huán)境變量在不同系統(tǒng)上有所不同,比如Solaries上就默認(rèn)搜索LD_LIBRARY_PATH。
比如:-agentlib:hprof
用來(lái)獲取jvm的運(yùn)行情況,包括CPU、內(nèi)存、線程等的運(yùn)行數(shù)據(jù),并可輸出到指定文件中;windows中搜索路徑為JRE_HOME/bin/hprof.dll。
-agentpath:pathname[=options]
按全路徑裝載本地庫(kù),不再搜索PATH中的路徑;其他功能和agentlib相同;更多的信息待續(xù),在后續(xù)的JVMTI部分會(huì)詳述。
-classpath classpath
-cp classpath
告知jvm搜索目錄名、jar文檔名、zip文檔名,之間用分號(hào);分隔;使用-classpath后jvm將不再使用CLASSPATH中的類搜索路徑,如果-classpath和CLASSPATH都沒(méi)有設(shè)置,則jvm使用當(dāng)前路徑(.)作為類搜索路徑。
jvm搜索類的方式和順序?yàn)椋築ootstrap,Extension,User。
Bootstrap中的路徑是jvm自帶的jar或zip文件,jvm首先搜索這些包文件,用System.getProperty("sun.boot.class.path")可得到搜索路徑。
Extension是位于JRE_HOME/lib/ext目錄下的jar文件,jvm在搜索完Bootstrap后就搜索該目錄下的jar文件,用System.getProperty("java.ext.dirs")可得到搜索路徑。
User搜索順序?yàn)楫?dāng)前路徑.、CLASSPATH、-classpath,jvm最后搜索這些目錄,用System.getProperty("java.class.path")可得到搜索路徑。
-Dproperty=value
設(shè)置系統(tǒng)屬性名/值對(duì),運(yùn)行在此jvm之上的應(yīng)用程序可用System.getProperty("property")得到value的值。
如果value中有空格,則需要用雙引號(hào)將該值括起來(lái),如-Dname="space string"。
該參數(shù)通常用于設(shè)置系統(tǒng)級(jí)全局變量值,如配置文件路徑,以便該屬性在程序中任何地方都可訪問(wèn)。
-enableassertions[:<package name>"..." | :<class name> ]
-ea[:<package name>"..." | :<class name> ]
上述參數(shù)就用來(lái)設(shè)置jvm是否啟動(dòng)斷言機(jī)制(從JDK 1.4開(kāi)始支持),缺省時(shí)jvm關(guān)閉斷言機(jī)制。
用-ea 可打開(kāi)斷言機(jī)制,不加<packagename>和classname時(shí)運(yùn)行所有包和類中的斷言,如果希望只運(yùn)行某些包或類中的斷言,可將包名或類名加到-ea之后。例如要啟動(dòng)包c(diǎn)om.wombat.fruitbat中的斷言,可用命令java -ea:com.wombat.fruitbat...<Main Class>。
-disableassertions[:<package name>"..." | :<class ; ]
-da[:<package name>"..." | :<class name> ]
用來(lái)設(shè)置jvm關(guān)閉斷言處理,packagename和classname的使用方法和-ea相同,jvm默認(rèn)就是關(guān)閉狀態(tài)。
該參數(shù)一般用于相同package內(nèi)某些class不需要斷言的場(chǎng)景,比如com.wombat.fruitbat需要斷言,但是com.wombat.fruitbat.Brickbat該類不需要,則可以如下運(yùn)行:
java -ea:com.wombat.fruitbat...-da:com.wombat.fruitbat.Brickbat <Main Class>。
-enablesystemassertions
-esa
激活系統(tǒng)類的斷言。
-disablesystemassertions
-dsa
關(guān)閉系統(tǒng)類的斷言。
-jar
指定以jar包的形式執(zhí)行一個(gè)應(yīng)用程序。
要這樣執(zhí)行一個(gè)應(yīng)用程序,必須讓jar包的manifest文件中聲明初始加載的Main-class,當(dāng)然那Main-class必須有public static void main(String[] args)方法。
-javaagent:jarpath[=options]
指定jvm啟動(dòng)時(shí)裝入java語(yǔ)言設(shè)備代理。
Jarpath文件中的mainfest文件必須有Agent-Class屬性。代理類也必須實(shí)現(xiàn)公共的靜態(tài)public static void premain(String agentArgs, Instrumentation inst)方法(和main方法類似)。當(dāng)jvm初始化時(shí),將按代理類的說(shuō)明順序調(diào)用premain方法;具體參見(jiàn)java.lang.instrument軟件包的描述。
-verbose
-verbose:class
輸出jvm載入類的相關(guān)信息,當(dāng)jvm報(bào)告說(shuō)找不到類或者類沖突時(shí)可此進(jìn)行診斷。
-verbose:gc
輸出每次GC的相關(guān)情況。
-verbose:jni
輸出native方法調(diào)用的相關(guān)情況,一般用于診斷jni調(diào)用錯(cuò)誤信息。
-version
輸出java的版本信息,比如jdk版本、vendor、model。
-version:release
指定class或者jar運(yùn)行時(shí)需要的jdk版本信息;若指定版本未找到,則以能找到的系統(tǒng)默認(rèn)jdk版本執(zhí)行;一般情況下,對(duì)于jar文件,可以在manifest文件中指定需要的版本信息,而不是在命令行。
release中可以指定單個(gè)版本,也可以指定一個(gè)列表,中間用空格隔開(kāi),且支持復(fù)雜組合,比如:
-version:"1.5.0_04 1.5*&1.5.1_02+"
指定class或者jar需要jdk版本為1.5.0_04或者是1.5系列中比1.5.1_02更高的所有版本。
-showversion
輸出java版本信息(與-version相同)之后,繼續(xù)輸出java的標(biāo)準(zhǔn)參數(shù)列表及其描述。
-?
-help
輸出java標(biāo)準(zhǔn)參數(shù)列表及其描述。
-X
輸出非標(biāo)準(zhǔn)的參數(shù)列表及其描述。
以上的這些參數(shù)我們經(jīng)常會(huì)在很多情況下用到多個(gè)的組合,比如我們?cè)谟肑Profiler進(jìn)行跟蹤監(jiān)控時(shí),需要在被監(jiān)控java啟動(dòng)參數(shù)中加上如下配置:
-agentlib:jprofilerti=port=8849 -Xbootclasspath/a:/usr/local/jprofiler5/bin/agent.jar
其中就用到兩個(gè)-agentlib和-X參數(shù),bootclasspath參數(shù)的詳細(xì)信息將會(huì)在非標(biāo)準(zhǔn)參數(shù)中詳細(xì)說(shuō)明。
轉(zhuǎn)自:http://blog.csdn.net/sfdev/article/details/2062042
這篇文章補(bǔ)充說(shuō)明了-X、-XX參數(shù)的說(shuō)明:Java命令行運(yùn)行參數(shù)說(shuō)明大全(偷來(lái)的)