1. JVM參數(shù)分類(lèi)
- 標(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),此類(lèi)參數(shù)各個(gè)jvm實(shí)現(xiàn)會(huì)有所不同略板,將來(lái)可能會(huì)隨時(shí)取消毁枯,需要慎重使用,一般JVM調(diào)優(yōu)使用的即此類(lèi)參數(shù)叮称。
2. 標(biāo)準(zhǔn)參數(shù)(-)
比如-version种玛、-help等藐鹤,幾乎所有的JDK版本都不會(huì)改變。下面再列舉幾個(gè)常見(jiàn)的標(biāo)準(zhǔn)參數(shù):
-client
設(shè)置JVM使用client模式赂韵,常用于客戶端應(yīng)用程序或者調(diào)試娱节。其特點(diǎn)為啟動(dòng)速度快,但是運(yùn)行時(shí)性能和內(nèi)存效率不高祭示。-server
設(shè)置JVM使用server模式括堤,一般線上應(yīng)用都使用此模式,在具有64位能力的jdk環(huán)境下將默認(rèn)啟用該模式绍移,而忽略-client參數(shù)悄窃。其特點(diǎn)是啟動(dòng)速度慢,運(yùn)行性能和內(nèi)存效率高蹂窖。-classpath classpath / -cp classpath
使用-classpath后jvm將不再使用CLASSPATH中的類(lèi)搜索路徑轧抗,如果-classpath和CLASSPATH都沒(méi)有設(shè)置,則jvm使用當(dāng)前路徑(.)作為類(lèi)搜索路徑瞬测。
jvm搜索類(lèi)的方式和順序?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)逗余。-jar
指定以jar包的形式運(yùn)行應(yīng)用程序。使用這種方式季惩,jar包中的mainfest文件中必須聲明初始加載的Main-class录粱,同時(shí)Main-class必須有public static void main(String[] args)方法腻格。
- -verbose:class
輸出jvm載入類(lèi)的相關(guān)信息,當(dāng)jvm報(bào)告說(shuō)找不到類(lèi)或者類(lèi)沖突時(shí)可此進(jìn)行診斷啥繁。 - -verbose:gc
輸出每次GC的相關(guān)情況菜职。 - -verbose:jni
輸出native方法調(diào)用的相關(guān)情況,一般用于診斷jni調(diào)用錯(cuò)誤信息旗闽。
3. 非標(biāo)準(zhǔn)參數(shù)(-X)
一般很少使用酬核。
- -Xint,解釋執(zhí)行模式适室,所有的字節(jié)碼將被直接執(zhí)行嫡意,而不會(huì)編譯成本地碼;
- -Xcomp捣辆,編譯模式蔬螟;
- -Xmixed,開(kāi)啟混合模式(默認(rèn)),先編譯成字節(jié)碼汽畴,然后執(zhí)行旧巾。
4. 非Stable參數(shù)(-XX)
這類(lèi)參數(shù)是進(jìn)行jvm參數(shù)調(diào)優(yōu)可能會(huì)進(jìn)行修改,不過(guò)這類(lèi)參數(shù)不是穩(wěn)定的忍些,不同版本的jvm中鲁猩,可能對(duì)應(yīng)的參數(shù)名稱(chēng)不同。并且可能在未來(lái)的版本被刪除或重命名罢坝。
4.1 類(lèi)型分類(lèi)
-XX參數(shù)按照參數(shù)類(lèi)型進(jìn)行分類(lèi)的話廓握,可以分成兩類(lèi):布爾類(lèi)型和KV鍵值對(duì)類(lèi)型。
4.1.1 布爾類(lèi)型
-XX:+某個(gè)屬性
開(kāi)啟某個(gè)jvm屬性炸客,-XX:+PrintGCDetails疾棵,開(kāi)啟GC詳細(xì)信息戈钢。
-XX:-某個(gè)屬性
關(guān)閉某個(gè)jvm屬性痹仙,不是所有的屬性都如此
4.1.2 KV鍵值對(duì)類(lèi)型
-XX:屬性key=值value
。比如-XX:Metaspace=128m
殉了、-XX:SurvivorRatio=4
开仰。
4.2. 功能分類(lèi)
-XX參數(shù)按照功能進(jìn)行分類(lèi)的話,可以大概分為
- 行為參數(shù):用于改變jvm的一些基礎(chǔ)行為薪铜;
- 性能參數(shù):用于jvm的性能調(diào)優(yōu)众弓;
- 調(diào)試參數(shù):一般用于打開(kāi)跟蹤、打印隔箍、輸出等jvm參數(shù)谓娃,用于顯示jvm更加詳細(xì)的信息。
4.2.1 行為參數(shù)
-
-XX:-DisableExplicitGC
禁止調(diào)用System.gc()蜒滩;但jvm的gc仍然有效 -
-XX:+MaxFDLimit
最大化文件描述符的數(shù)量限制 -
-XX:+ScavengeBeforeFullGC
新生代GC優(yōu)先于Full GC執(zhí)行 -
-XX:+UseGCOverheadLimit
在拋出OOM之前限制jvm耗費(fèi)在GC上的時(shí)間比例 -
-XX:-UseConcMarkSweepGC
對(duì)老生代采用并發(fā)標(biāo)記交換算法進(jìn)行GC -
-XX:-UseParallelGC
啟用并行GC -
-XX:-UseParallelOldGC
對(duì)Full GC啟用并行滨达,當(dāng)-XX:-UseParallelGC啟用時(shí)該項(xiàng)自動(dòng)啟用 -
-XX:-UseSerialGC
啟用串行GC -
-XX:+UseThreadPriorities
啟用本地線程優(yōu)先級(jí)
4.2.2 性能參數(shù)
-
-XX:LargePageSizeInBytes=4m
設(shè)置用于Java堆的大頁(yè)面尺寸 -
-XX:MaxHeapFreeRatio=70
GC后java堆中空閑量占的最大比例 -
-XX:MaxNewSize=size
新生成對(duì)象能占用內(nèi)存的最大值 -
-XX:MaxPermSize=64m
老生代對(duì)象能占用內(nèi)存的最大值 -
-XX:MinHeapFreeRatio=40
GC后java堆中空閑量占的最小比例 -
-XX:NewRatio=2
新生代內(nèi)存容量與老生代內(nèi)存容量的比例 -
-XX:NewSize=2.125m
新生代對(duì)象生成時(shí)占用內(nèi)存的默認(rèn)值 -
-XX:ReservedCodeCacheSize=32m
保留代碼占用的內(nèi)存容量 -
-XX:ThreadStackSize=512
設(shè)置線程棧大小奶稠,若為0則使用系統(tǒng)默認(rèn)值 -
-XX:+UseLargePages
使用大頁(yè)面內(nèi)存 -
-Xms
等價(jià)于-XX:InitialHeapSize
初始化堆內(nèi)存大小 -
-Xmx
等價(jià)于-XX:MaxHeapSize
最大的堆內(nèi)存大小 -
-Xmn
等價(jià)于-XX:NewSize=size
設(shè)置初始的年輕代的大小 -
-Xss
等價(jià)于-XX:ThresholdStackSize
。用于設(shè)置單個(gè)棧的大小捡遍,系統(tǒng)默認(rèn)值是0锌订,不代表?xiàng)4笮?。而是根據(jù)操作系統(tǒng)的不同画株,有不同的值辆飘。比如64位的Linux系統(tǒng)是1024K,而Windows系統(tǒng)依賴(lài)于虛擬內(nèi)存谓传。
4.2.3 調(diào)試參數(shù)
-
-XX:-CITime
打印消耗在JIT編譯的時(shí)間 -
-XX:ErrorFile=./hs_err_pid<pid>.log
保存錯(cuò)誤日志或者數(shù)據(jù)到文件中 -
-XX:-ExtendedDTraceProbes
開(kāi)啟solaris特有的dtrace探針 -
-XX:HeapDumpPath=./java_pid<pid>.hprof
指定導(dǎo)出堆信息時(shí)的路徑或文件名 -
-XX:-HeapDumpOnOutOfMemoryError
當(dāng)首次遭遇OOM時(shí)導(dǎo)出此時(shí)堆中相關(guān)信息 -
-XX:OnError="<cmd args>;<cmd args>"
出現(xiàn)致命ERROR之后運(yùn)行自定義命令 -
-XX:OnOutOfMemoryError="<cmd args>;<cmd args>"
當(dāng)首次遭遇OOM時(shí)執(zhí)行自定義命令 -
-XX:-PrintClassHistogram
遇到Ctrl-Break后打印類(lèi)實(shí)例的柱狀信息蜈项,與jmap -histo功能相同 -
-XX:-PrintConcurrentLocks
遇到Ctrl-Break后打印并發(fā)鎖的相關(guān)信息,與jstack -l功能相同 -
-XX:-PrintCommandLineFlags
打印在命令行中出現(xiàn)過(guò)的標(biāo)記 -
-XX:-PrintCompilation
當(dāng)一個(gè)方法被編譯時(shí)打印相關(guān)信息 -
-XX:-PrintGC
每次GC時(shí)打印相關(guān)信息 -
-XX:-PrintGC Details
每次GC時(shí)打印詳細(xì)信息 -
-XX:-PrintGCTimeStamps
打印每次GC的時(shí)間戳 -
-XX:-TraceClassLoading
跟蹤類(lèi)的加載信息,(jre/lib/rt.jar下的類(lèi)全部加載续挟,起來(lái)類(lèi)用到的時(shí)候再加載) -
-XX:-TraceClassLoadingPreorder
跟蹤被引用到的所有類(lèi)的加載信息 -
-XX:-TraceClassResolution
跟蹤常量池 -
-XX:-TraceClassUnloading
跟蹤類(lèi)的卸載信息 -
-XX:-TraceLoaderConstraints
跟蹤類(lèi)加載器約束的相關(guān)信息
4.3. 查看參數(shù)
- 查看某個(gè)參數(shù)
使用jps -l
配合jinfo -flag JVM參數(shù) pid
战得。先用jsp -l
查看java進(jìn)程,選擇某個(gè)進(jìn)程號(hào)庸推。
17888 org.jetbrains.jps.cmdline.Launcher
5360 org.jetbrains.idea.maven.server.RemoteMavenServer
18052 demo3.demo3
jinfo -flag PrintGCDetails 18052
可以查看18052 Java進(jìn)程的PrintGCDetails
參數(shù)信息常侦。
-XX:-PrintGCDetails
- 查看所有參數(shù)
使用jps -l
配合jinfo -flags pid
可以查看所有參數(shù)。
也可以使用java -XX:+PrintFlagsInitial
[Global flags]
intx ActiveProcessorCount = -1 {product}
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
uintx AdaptiveSizePausePolicy = 0 {product}
······
uintx YoungPLABSize = 4096 {product}
bool ZeroTLAB = false {product}
intx hashCode = 5 {product}
- 查看修改后的參數(shù)
使用java -XX:PrintFlagsFinal
可以查看修改后的參數(shù)贬媒,與上面類(lèi)似聋亡。只是修改過(guò)后是:=
而不是=
。
- 查看常見(jiàn)參數(shù)
如果不想查看所有參數(shù)际乘,可以用-XX:+PrintCommandLineFlags
查看常用參數(shù)坡倔。
-XX:InitialHeapSize=132375936 -XX:MaxHeapSize=2118014976 -XX:+PrintCommandLineFlags -XX:+UseCompressedCla
擴(kuò)展閱讀
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html;