這篇文章主要為大家展示了“Java虛擬機(jī)中常用vm參數(shù)的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Java虛擬機(jī)中常用vm參數(shù)的示例分析”這篇文章吧。
10余年的昆山網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整昆山建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“昆山網(wǎng)站設(shè)計(jì)”,“昆山網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。首先想說(shuō)的是其實(shí)這些參數(shù)我們并不是陌生的,在平時(shí)的開(kāi)發(fā)和使用中經(jīng)常都會(huì)遇到,只是在平時(shí)缺少一個(gè)比較系統(tǒng)的總結(jié),所以,對(duì)這些參數(shù)感覺(jué)是很陌生的,所以,通過(guò)這篇文章的總結(jié),我相信你一定都會(huì)對(duì)這些參數(shù)熟稔于心,做做心中有數(shù)。
在Java虛擬機(jī)的參數(shù)中,其實(shí)可以把這些參數(shù)分為三類(lèi),當(dāng)然,這是針對(duì)JDK1.6來(lái)說(shuō)的,如果對(duì)于JDK1.8,那么就不是這么分類(lèi)的了,但是,由于這兩個(gè)版本很多常用的參數(shù)的差別是不大的,所以這篇文章就先介紹JDK1.6的VM參數(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)都滿(mǎn)足,且不保證向后兼容。
非Stable參數(shù)(-XX)
,此類(lèi)參數(shù)各個(gè)JVM實(shí)現(xiàn)會(huì)有所不同,將來(lái)可能會(huì)隨時(shí)取消,需要慎重使用。
雖然是這么分類(lèi)的,實(shí)際上呢,非標(biāo)準(zhǔn)參數(shù)和非穩(wěn)定的參數(shù)實(shí)際的使用中還是用的非常的多的,在后面的文章的介紹中你就會(huì)發(fā)現(xiàn)。
這一類(lèi)參數(shù)可以說(shuō)是我們剛剛開(kāi)始Java是就用的非常多的參數(shù)了,比如java -version
、java -jar
等等,我們?cè)贑MD中輸入java -help
就可以獲得Java當(dāng)前版本的所有標(biāo)準(zhǔn)參數(shù)了。
如上圖就是JDK1.8的所有標(biāo)準(zhǔn)參數(shù)了,下面我們將介紹一些我們會(huì)用的比較多的參數(shù)。
-client
以client模式啟動(dòng)JVM,這種方式啟動(dòng)速度快,但運(yùn)行時(shí)性能和內(nèi)存管理效率不高,適合客戶(hù)端程序或者開(kāi)發(fā)調(diào)試。
-server
以server模式啟動(dòng)JVM,與client情況恰好相反。適合生產(chǎn)環(huán)境,適用于服務(wù)器。64位的JVM自動(dòng)以server模式啟動(dòng)。
-classpath或者-cp
通知JVM類(lèi)搜索路徑。如果指定了-classpath
,則JVM就忽略CLASSPATH
中指定的路徑。各路徑之間以分號(hào)隔開(kāi)。如果-classpath
和CLASSPATH
都沒(méi)有指定,則JVM從當(dāng)前路徑尋找class。
JVM搜索路徑的順序:
1.先搜索JVM自帶的jar或zip包。
Bootstrap,搜索路徑可以用System.getProperty("sun.boot.class.path")
獲得;
2.搜索JRE_HOME/lib/ext
下的jar包。
Extension,搜索路徑可以用System.getProperty("java.ext.dirs")
獲得;
3.搜索用戶(hù)自定義目錄,順序?yàn)椋寒?dāng)前目錄(.),CLASSPATH,-cp。
搜索路徑用System.getProperty("java.class.path")
獲得。
System.out.println(System.getProperty("sun.boot.class.path")); System.out.println(System.getProperty("java.ext.dirs")); System.out.println(System.getProperty("java.class.path"));
如上就是我電腦的JVM的路徑。
-DpropertyName=value
定義系統(tǒng)的全局屬性值,如配置文件地址等,如果value有空格,則需要使用雙引號(hào)。
另外用System.getProperty("hello")
可以獲得這些定義的屬性值,在代碼中也可以用System.setProperty("hello","world")
的形式來(lái)定義屬性。
如鍵值對(duì)設(shè)置為hello=world。
System.out.println(System.getProperty("hello"));
運(yùn)行結(jié)果就是:
-verbose
查詢(xún)GC問(wèn)題最常用的命令之一,參數(shù)如下:
-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ò)誤信息。
另外,控制臺(tái)輸出GC信息還可以使用如下命令:
在JVM的啟動(dòng)參數(shù)中加入-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime
,按照參數(shù)的順序分別輸出GC的簡(jiǎn)要信息,GC的詳細(xì)信息、GC的時(shí)間信息及GC造成的應(yīng)用暫停的時(shí)間。
非標(biāo)注的參數(shù)主要是關(guān)于Java內(nèi)存區(qū)域的設(shè)置參數(shù),所以在看這些參數(shù)之前,應(yīng)該先查看Java內(nèi)存區(qū)域的基礎(chǔ)知識(shí),可以查看這篇文章:深入理解Java虛擬機(jī)-Java內(nèi)存區(qū)域透徹分析。
非標(biāo)準(zhǔn)參數(shù)實(shí)在標(biāo)準(zhǔn)參數(shù)的基礎(chǔ)上的一些擴(kuò)充參數(shù),可以輸入java -X
,獲得當(dāng)前JVM支持的非標(biāo)準(zhǔn)參數(shù)。
從圖片中可以看出來(lái),這些非標(biāo)準(zhǔn)的參數(shù)其實(shí)不多的,下面我們?cè)?講解一些比較常用的參數(shù)。
-Xmn
新生代內(nèi)存大小的大值,包括E區(qū)和兩個(gè)S區(qū)的總和。設(shè)置方法:-Xmn512m、-Xmn2g
。
-Xms
初始堆的大小,也是堆大小的最小值,默認(rèn)值是總共的物理內(nèi)存/64(且小于1G)。默認(rèn)情況下,當(dāng)堆中可用內(nèi)存小于40%,堆內(nèi)存會(huì)開(kāi)始增加,一直增加到-Xmx的大小。
-Xmx
堆的大值,默認(rèn)值是總共的物理內(nèi)存/64(且小于1G),默認(rèn)情況下,當(dāng)堆中可用內(nèi)存大于70%,堆內(nèi)存會(huì)開(kāi)始減少,一直減小到-Xms的大小。
因此,為了避免這種浮動(dòng),所以在設(shè)置-Xms
和-Xmx
參數(shù)時(shí),一般會(huì)設(shè)置成一樣的,能夠提高性能。
另外,官方默認(rèn)的配置為年老代大小:年輕代大小=2:1左右,使用-XX:NewRatio
可以設(shè)置年老代和年輕代之比,例如,-XX:NewRatio=4
,表示年老代:年輕代=4:1
參數(shù)實(shí)例
設(shè)置-Xms
、-Xmn
和-Xmx
參數(shù)分別為-Xms512m -Xmx512m -Xmn128m
。同時(shí)設(shè)置新生代和老生代之比為1:4,E:S0:S1=8:1:1。
** * @ClassName MethodTest * @Description vm參數(shù)設(shè)置:-Xms512m -Xmx512m -Xmn128m -XX:NewRatio=4 -XX:SurvivorRatio=8 * @Author 歐陽(yáng)思海 * @Date 2019/11/25 20:06 * @Version 1.0 **/ public class MethodTest { public static void main(String[] args) { Listlist = new ArrayList (); long i = 0; while (i < 1000000000) { System.out.println(i); list.add(String.valueOf(i++).intern()); } } }
運(yùn)行之后,用VisualVM查看相關(guān)信息是否正確。
當(dāng)我們沒(méi)有設(shè)置-XX:NewRatio=4 -XX:SurvivorRatio=8
時(shí),使用官方默認(rèn)的情況如下:
上圖可以看出,新生代(Eden Space + Survivor 0 + Survivor 1):老年代(Old Gen)≈ 1:2。
當(dāng)我們設(shè)置了-XX:NewRatio=4 -XX:SurvivorRatio=8
時(shí),情況如下:
變成了新生代(Eden Space + Survivor 0 + Survivor 1):老年代(Old Gen)≈ 1:4,Eden Space:Survivor 0: Survivor 1 = 8:1:1。
從上圖可知,堆的信息是正確的。
-Xss
設(shè)置每個(gè)線程的棧內(nèi)存,默認(rèn)1M,一般來(lái)說(shuō)是不需要改的。
-Xprof
跟蹤正運(yùn)行的程序,并將跟蹤數(shù)據(jù)在標(biāo)準(zhǔn)輸出輸出;適合于開(kāi)發(fā)環(huán)境調(diào)試。
-Xnoclassgc
禁用類(lèi)垃圾收集,關(guān)閉針對(duì)class的gc功能;因?yàn)槠渥柚箖?nèi)存回收,所以可能會(huì)導(dǎo)致OutOfMemoryError錯(cuò)誤,慎用。
-Xincgc
開(kāi)啟增量gc(默認(rèn)為關(guān)閉);這有助于減少長(zhǎng)時(shí)間GC時(shí)應(yīng)用程序出現(xiàn)的停頓;但由于可能和應(yīng)用程序并發(fā)執(zhí)行,所以會(huì)降低CPU對(duì)應(yīng)用的處理能力。
-Xloggc:file
與-verbose:gc
功能類(lèi)似,只是將每次GC事件的相關(guān)情況記錄到一個(gè)文件中,文件的位置最好在本地,以避免網(wǎng)絡(luò)的潛在問(wèn)題。
若與verbose命令同時(shí)出現(xiàn)在命令行中,則以-Xloggc為準(zhǔn)。
-Xint
在解釋模式(interpreted mode)下,-Xint
標(biāo)記會(huì)強(qiáng)制JVM執(zhí)行所有的字節(jié)碼,這會(huì)降低運(yùn)行速度,通常低10倍或更多。
-Xcomp
-Xcomp參數(shù)與它(-Xint)正好相反,JVM在第一次使用時(shí)會(huì)把所有的字節(jié)碼編譯成本地代碼,從而帶來(lái)大程度的優(yōu)化。
然而,很多應(yīng)用在使用-Xcomp
也會(huì)有一些性能損失,當(dāng)然這比使用-Xint損失的少,原因是-xcomp
沒(méi)有讓JVM啟用JIT
編譯器的全部功能。JIT編譯器可以對(duì)是否需要編譯做判斷,如果所有代碼都進(jìn)行編譯的話,對(duì)于一些只執(zhí)行一次的代碼就沒(méi)有意義了。
-Xmixed
-Xmixed
是混合模式,這是JVM默認(rèn)的模式,也是推薦使用的模式。將解釋模式與編譯模式進(jìn)行混合使用,由JVM自己決定。
這類(lèi)參數(shù)你一看官網(wǎng)以為不能使用呢,官網(wǎng)給你的建議就是這些參數(shù)不穩(wěn)定,慎用,其實(shí)這主要的原因還是因?yàn)槊總€(gè)公司的實(shí)現(xiàn)都是不一樣的,所以就是導(dǎo)致不穩(wěn)定。但是呢,在實(shí)際的使用中卻是非常的多的,而且這部分的參數(shù)很重要。
這些參數(shù)大致可以分為三類(lèi):
性能參數(shù)(Performance Options):用于JVM的性能調(diào)優(yōu)和內(nèi)存分配控制,如初始化內(nèi)存大小的設(shè)置;
行為參數(shù)(Behavioral Options):用于改變JVM的基礎(chǔ)行為,如GC的方式和算法的選擇;
調(diào)試參數(shù)(Debugging Options):用于監(jiān)控、打印、輸出等jvm參數(shù),用于顯示jvm更加詳細(xì)的信息;
下面還是先羅列一些比較常用的參數(shù),其實(shí),這些文章很多了,這里主要還是做一個(gè)總結(jié),以后自己看文章的時(shí)候比較方便,如果有同行看到了文章,你可以參考參考,還是很有幫助的。
另外,選取其中的一些參數(shù)做一些例子來(lái)解釋?zhuān)@樣也能夠更加的形象。
注意:以下參數(shù)都是JDK1.7及以下可以使用。
性能參數(shù)
參數(shù)及其默認(rèn)值 | 描述 |
---|---|
-XX:LargePageSizeInBytes=4m | 設(shè)置用于Java堆的大頁(yè)面尺寸 |
-XX:MaxHeapFreeRatio=70 | GC后java堆中空閑量占的大比例 |
-XX:MinHeapFreeRatio=40 | GC后java堆中空閑量占的最小比例 |
-XX:MaxNewSize=size | 新生成對(duì)象能占用內(nèi)存的大值 |
-XX:MaxPermSize=64m | 老生代對(duì)象能占用內(nèi)存的大值 |
-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)存 |
行為參數(shù)
參數(shù)及其默認(rèn)值 | 描述 |
---|---|
-XX:+ScavengeBeforeFullGC | 新生代GC優(yōu)先于Full GC執(zhí)行 |
-XX:+UseGCOverheadLimit | 在拋出OOM之前限制jvm耗費(fèi)在GC上的時(shí)間比例 |
-XX:-UseParNewGC | 打開(kāi)此開(kāi)關(guān),使用ParNew+Serial Old 收集器 |
-XX:-UseConcMarkSweepGC | 使用ParNew+CMS+Serial Old 收集器對(duì)老生代采用并發(fā)標(biāo)記交換算法進(jìn)行GC |
-XX:-UseParallelGC | 啟用并行GC,使用ParallelScavenge+Serial Old 收集器 |
-XX:-UseParallelOldGC | 對(duì)Full GC啟用并行,當(dāng)-XX:-UseParallelGC 啟用時(shí)該項(xiàng)自動(dòng)啟用,ParallelScavenge+Parallel Old 收集器 |
-XX:-UseSerialGC | 啟用串行GC |
-XX:+UseG1GC | 使用垃圾優(yōu)先(G1)收集器 |
-XX:SurvivorRatio=n | Eden區(qū)域與Survivor區(qū)域大小之比。預(yù)設(shè)值為8 |
-XX:PretenureSizeThreshold=n | 直接晉升到老年代的對(duì)象大小,設(shè)置這個(gè)參數(shù)之后,大于這個(gè)參數(shù)的對(duì)象直接進(jìn)入到老年代分配 |
-XX:MaxTenuringThreshold=n | 晉升到老年代的對(duì)象年齡,每個(gè)對(duì)象在堅(jiān)持過(guò)一次Minor GC之后,年齡加1,當(dāng)超過(guò)這個(gè)值之后就進(jìn)入老年代。預(yù)設(shè)值為15 |
-XX:+UseAdaptiveSizePolicy | 動(dòng)態(tài)調(diào)整Java堆中各個(gè)區(qū)域的大小以及進(jìn)入老年代的年齡 |
-XX:ParallelGCThreads=n | 設(shè)置并行收集器收集時(shí)使用的CPU數(shù)。并行收集線程數(shù) |
-XX:MaxGCPauseMillis=n | 設(shè)置并行收集大暫停時(shí)間 |
-XX:GCTimeRatio=n | 設(shè)置垃圾回收時(shí)間占程序運(yùn)行時(shí)間的百分比。公式為1/(1+N) |
-XX:+UseThreadPriorities | 啟用本地線程優(yōu)先級(jí) |
-XX:-DisableExplicitGC | 禁止調(diào)用System.gc() ;但jvm的gc仍然有效 |
-XX:+MaxFDLimit | 大化文件描述符的數(shù)量限制 |
前面6個(gè)參數(shù)都是關(guān)于垃圾收集器的行為參數(shù),也是經(jīng)常會(huì)用到的參數(shù)。
調(diào)試參數(shù)
參數(shù)及其默認(rèn)值 | 描述 |
---|---|
-XX:-CITime | 打印消耗在JIT編譯的時(shí)間 |
-XX:ErrorFile=./hs_err_pid\ | 保存錯(cuò)誤日志或者數(shù)據(jù)到文件中 |
-XX:HeapDumpPath=./java_pid\ | 指定導(dǎo)出堆信息時(shí)的路徑或文件名 |
-XX:-HeapDumpOnOutOfMemoryError | 當(dāng)首次遭遇OOM時(shí)導(dǎo)出此時(shí)堆中相關(guān)信息 |
-XX:OnError="\ | 出現(xiàn)致命ERROR之后運(yùn)行自定義命令 |
-XX:OnOutOfMemoryError="\ | 當(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:-PrintGCDetails | 每次GC時(shí)打印詳細(xì)信息 |
-XX:-PrintGCTimeStamps | 打印每次GC的時(shí)間戳 |
-XX:-TraceClassLoading | 跟蹤類(lèi)的加載信息 |
-XX:-TraceClassLoadingPreorder | 跟蹤被引用到的所有類(lèi)的加載信息 |
-XX:-TraceCla***esolution | 跟蹤常量池 |
-XX:-TraceClassUnloading | 跟蹤類(lèi)的卸載信息 |
-XX:-TraceLoaderConstraints | 跟蹤類(lèi)加載器約束的相關(guān)信息 |
以上是“Java虛擬機(jī)中常用vm參數(shù)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站制作公司行業(yè)資訊頻道!
創(chuàng)新互聯(lián)www.cdcxhl.cn,專(zhuān)業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。