深入理解Java虛擬機-常用vm參數(shù)分析

Java虛擬機深入理解系列全部文章更新中...

話不多說,今天就分析一下一些常用的Java虛擬機的參數(shù)設(shè)置,以及如何更好的使用!

1 JVM參數(shù)簡介

首先想說的是其實這些參數(shù)我們并不是陌生的,在平時的開發(fā)和使用中經(jīng)常都會遇到髓帽,只是在平時缺少一個比較系統(tǒng)的總結(jié),所以,對這些參數(shù)感覺是很陌生的芥驳,所以,通過這篇文章的總結(jié)茬高,我相信你一定都會對這些參數(shù)熟稔于心兆旬,做做心中有數(shù)。

在Java虛擬機的參數(shù)中怎栽,其實可以把這些參數(shù)分為三類丽猬,當(dāng)然,這是針對JDK1.6來說的熏瞄,如果對于JDK1.8脚祟,那么就不是這么分類的了,但是强饮,由于這兩個版本很多常用的參數(shù)的差別是不大的由桌,所以這篇文章就先介紹JDK1.6的VM參數(shù)。

主要可以分為以下三類:

  • 標(biāo)準(zhǔn)參數(shù)(-)邮丰,所有的JVM實現(xiàn)都必須實現(xiàn)這些參數(shù)的功能行您,而且向后兼容。
  • 非標(biāo)準(zhǔn)參數(shù)(-X)剪廉,默認(rèn)JVM實現(xiàn)這些參數(shù)的功能娃循,但是并不保證所有JVM實現(xiàn)都滿足,且不保證向后兼容斗蒋。
  • 非Stable參數(shù)(-XX)淮野,此類參數(shù)各個JVM實現(xiàn)會有所不同,將來可能會隨時取消吹泡,需要慎重使用骤星。

雖然是這么分類的,實際上呢爆哑,非標(biāo)準(zhǔn)參數(shù)和非穩(wěn)定的參數(shù)實際的使用中還是用的非常的多的洞难,在后面的文章的介紹中你就會發(fā)現(xiàn)。

2 標(biāo)準(zhǔn)參數(shù)

這一類參數(shù)可以說是我們剛剛開始Java是就用的非常多的參數(shù)了揭朝,比如java -version队贱、java -jar等等色冀,我們在CMD中輸入java -help就可以獲得Java當(dāng)前版本的所有標(biāo)準(zhǔn)參數(shù)了。

image

如上圖就是JDK1.8的所有標(biāo)準(zhǔn)參數(shù)了柱嫌,下面我們將介紹一些我們會用的比較多的參數(shù)锋恬。

  • -client

以client模式啟動JVM,這種方式啟動速度快编丘,但運行時性能和內(nèi)存管理效率不高与学,適合客戶端程序或者開發(fā)調(diào)試。

  • -server

以server模式啟動JVM嘉抓,與client情況恰好相反索守。適合生產(chǎn)環(huán)境,適用于服務(wù)器抑片。64位的JVM自動以server模式啟動卵佛。

  • -classpath或者-cp

通知JVM類搜索路徑。如果指定了-classpath敞斋,則JVM就忽略CLASSPATH中指定的路徑截汪。各路徑之間以分號隔開。如果-classpathCLASSPATH都沒有指定植捎,則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.搜索用戶自定義目錄,順序為:當(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"));
image

如上就是我電腦的JVM的路徑角虫。

  • -DpropertyName=value

定義系統(tǒng)的全局屬性值,如配置文件地址等委造,如果value有空格戳鹅,則需要使用雙引號。

另外用System.getProperty("hello")可以獲得這些定義的屬性值昏兆,在代碼中也可以用System.setProperty("hello","world")的形式來定義屬性枫虏。

如鍵值對設(shè)置為hello=world。


image
System.out.println(System.getProperty("hello"));

運行結(jié)果就是:


image
  • -verbose

查詢GC問題最常用的命令之一,參數(shù)如下:
-verbose:class
輸出JVM載入類的相關(guān)信息隶债,當(dāng)JVM報告說找不到類或者類沖突時可此進行診斷腾它。
-verbose:gc
輸出每次GC的相關(guān)情況。
-verbose:jni
輸出native方法調(diào)用的相關(guān)情況死讹,一般用于診斷jni調(diào)用錯誤信息瞒滴。

另外,控制臺輸出GC信息還可以使用如下命令:

在JVM的啟動參數(shù)中加入-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime赞警,按照參數(shù)的順序分別輸出GC的簡要信息妓忍,GC的詳細信息、GC的時間信息及GC造成的應(yīng)用暫停的時間仅颇。

3 非標(biāo)準(zhǔn)參數(shù)

非標(biāo)注的參數(shù)主要是關(guān)于Java內(nèi)存區(qū)域的設(shè)置參數(shù),所以在看這些參數(shù)之前碘举,應(yīng)該先查看Java內(nèi)存區(qū)域的基礎(chǔ)知識忘瓦,可以查看這篇文章:深入理解Java虛擬機-Java內(nèi)存區(qū)域透徹分析

非標(biāo)準(zhǔn)參數(shù)實在標(biāo)準(zhǔn)參數(shù)的基礎(chǔ)上的一些擴充參數(shù)引颈,可以輸入java -X耕皮,獲得當(dāng)前JVM支持的非標(biāo)準(zhǔn)參數(shù)。

image

從圖片中可以看出來蝙场,這些非標(biāo)準(zhǔn)的參數(shù)其實不多的凌停,下面我們再 講解一些比較常用的參數(shù)。

  • -Xmn

新生代內(nèi)存大小的最大值售滤,包括E區(qū)和兩個S區(qū)的總和罚拟。設(shè)置方法:-Xmn512m、-Xmn2g完箩。

  • -Xms

初始堆的大小赐俗,也是堆大小的最小值,默認(rèn)值是總共的物理內(nèi)存/64(且小于1G)弊知。默認(rèn)情況下阻逮,當(dāng)堆中可用內(nèi)存小于40%,堆內(nèi)存會開始增加秩彤,一直增加到-Xmx的大小。

  • -Xmx

堆的最大值,默認(rèn)值是總共的物理內(nèi)存/64(且小于1G)苫拍,默認(rèn)情況下习蓬,當(dāng)堆中可用內(nèi)存大于70%,堆內(nèi)存會開始減少降盹,一直減小到-Xms的大小食呻。

因此,為了避免這種浮動,所以在設(shè)置-Xms-Xmx參數(shù)時仅胞,一般會設(shè)置成一樣的每辟,能夠提高性能。

另外干旧,官方默認(rèn)的配置為年老代大小:年輕代大小=2:1左右渠欺,使用-XX:NewRatio可以設(shè)置年老代和年輕代之比,例如椎眯,-XX:NewRatio=4挠将,表示年老代:年輕代=4:1

參數(shù)實例

設(shè)置-Xms-Xmn-Xmx參數(shù)分別為-Xms512m -Xmx512m -Xmn128m编整。同時設(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 歐陽思海
 * @Date 2019/11/25 20:06
 * @Version 1.0
 **/

public class MethodTest {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        long i = 0;
        while (i < 1000000000) {
            System.out.println(i);
            list.add(String.valueOf(i++).intern());
        }
    }
}

運行之后掌测,用VisualVM查看相關(guān)信息是否正確内贮。

當(dāng)我們沒有設(shè)置-XX:NewRatio=4 -XX:SurvivorRatio=8時,使用官方默認(rèn)的情況如下:

image

上圖可以看出汞斧,新生代(Eden Space + Survivor 0 + Survivor 1):老年代(Old Gen)≈ 1:2夜郁。

當(dāng)我們設(shè)置了-XX:NewRatio=4 -XX:SurvivorRatio=8時,情況如下:

image

變成了新生代(Eden Space + Survivor 0 + Survivor 1):老年代(Old Gen)≈ 1:4粘勒,Eden Space:Survivor 0: Survivor 1 = 8:1:1竞端。

image

從上圖可知,堆的信息是正確的庙睡。

  • -Xss

設(shè)置每個線程的棧內(nèi)存事富,默認(rèn)1M,一般來說是不需要改的乘陪。

  • -Xprof

跟蹤正運行的程序赵颅,并將跟蹤數(shù)據(jù)在標(biāo)準(zhǔn)輸出輸出;適合于開發(fā)環(huán)境調(diào)試暂刘。

  • -Xnoclassgc

禁用類垃圾收集,關(guān)閉針對class的gc功能饺谬;因為其阻止內(nèi)存回收,所以可能會導(dǎo)致OutOfMemoryError錯誤谣拣,慎用募寨。

  • -Xincgc

開啟增量gc(默認(rèn)為關(guān)閉);這有助于減少長時間GC時應(yīng)用程序出現(xiàn)的停頓森缠;但由于可能和應(yīng)用程序并發(fā)執(zhí)行拔鹰,所以會降低CPU對應(yīng)用的處理能力。

  • -Xloggc:file

-verbose:gc功能類似贵涵,只是將每次GC事件的相關(guān)情況記錄到一個文件中列肢,文件的位置最好在本地恰画,以避免網(wǎng)絡(luò)的潛在問題。
若與verbose命令同時出現(xiàn)在命令行中瓷马,則以-Xloggc為準(zhǔn)拴还。

  • -Xint

在解釋模式(interpreted mode)下,-Xint標(biāo)記會強制JVM執(zhí)行所有的字節(jié)碼欧聘,這會降低運行速度片林,通常低10倍或更多。

  • -Xcomp

-Xcomp參數(shù)與它(-Xint)正好相反怀骤,JVM在第一次使用時會把所有的字節(jié)碼編譯成本地代碼费封,從而帶來最大程度的優(yōu)化。

然而蒋伦,很多應(yīng)用在使用-Xcomp也會有一些性能損失弓摘,當(dāng)然這比使用-Xint損失的少,原因是-xcomp沒有讓JVM啟用JIT編譯器的全部功能痕届。JIT編譯器可以對是否需要編譯做判斷韧献,如果所有代碼都進行編譯的話,對于一些只執(zhí)行一次的代碼就沒有意義了爷抓。

  • -Xmixed

-Xmixed是混合模式势决,這是JVM默認(rèn)的模式阻塑,也是推薦使用的模式蓝撇。將解釋模式與編譯模式進行混合使用,由JVM自己決定陈莽。

4 非Stable參數(shù)

這類參數(shù)你一看官網(wǎng)以為不能使用呢渤昌,官網(wǎng)給你的建議就是這些參數(shù)不穩(wěn)定,慎用走搁,其實這主要的原因還是因為每個公司的實現(xiàn)都是不一樣的独柑,所以就是導(dǎo)致不穩(wěn)定。但是呢私植,在實際的使用中卻是非常的多的忌栅,而且這部分的參數(shù)很重要。

這些參數(shù)大致可以分為三類:

  • 性能參數(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更加詳細的信息唤反;

下面還是先羅列一些比較常用的參數(shù)凳寺,其實,這些文章很多了彤侍,這里主要還是做一個總結(jié)肠缨,以后自己看文章的時候比較方便,如果有同行看到了文章拥刻,你可以參考參考怜瞒,還是很有幫助的。

另外般哼,選取其中的一些參數(shù)做一些例子來解釋吴汪,這樣也能夠更加的形象。

注意:以下參數(shù)都是JDK1.7及以下可以使用蒸眠。

  • 性能參數(shù)
參數(shù)及其默認(rèn)值 描述
-XX:LargePageSizeInBytes=4m 設(shè)置用于Java堆的大頁面尺寸
-XX:MaxHeapFreeRatio=70 GC后java堆中空閑量占的最大比例
-XX:MinHeapFreeRatio=40 GC后java堆中空閑量占的最小比例
-XX:MaxNewSize=size 新生成對象能占用內(nèi)存的最大值
-XX:MaxPermSize=64m 老生代對象能占用內(nèi)存的最大值
-XX:NewRatio=2 新生代內(nèi)存容量與老生代內(nèi)存容量的比例
-XX:NewSize=2.125m 新生代對象生成時占用內(nèi)存的默認(rèn)值
-XX:ReservedCodeCacheSize=32m 保留代碼占用的內(nèi)存容量
-XX:ThreadStackSize=512 設(shè)置線程棧大小漾橙,若為0則使用系統(tǒng)默認(rèn)值
-XX:+UseLargePages 使用大頁面內(nèi)存
  • 行為參數(shù)
參數(shù)及其默認(rèn)值 描述
-XX:+ScavengeBeforeFullGC 新生代GC優(yōu)先于Full GC執(zhí)行
-XX:+UseGCOverheadLimit 在拋出OOM之前限制jvm耗費在GC上的時間比例
-XX:-UseParNewGC 打開此開關(guān),使用ParNew+Serial Old收集器
-XX:-UseConcMarkSweepGC 使用ParNew+CMS+Serial Old收集器對老生代采用并發(fā)標(biāo)記交換算法進行GC
-XX:-UseParallelGC 啟用并行GC楞卡,使用ParallelScavenge+Serial Old收集器
-XX:-UseParallelOldGC 對Full GC啟用并行霜运,當(dāng)-XX:-UseParallelGC啟用時該項自動啟用,ParallelScavenge+Parallel Old收集器
-XX:-UseSerialGC 啟用串行GC
-XX:+UseG1GC 使用垃圾優(yōu)先(G1)收集器
-XX:SurvivorRatio=n Eden區(qū)域與Survivor區(qū)域大小之比蒋腮。預(yù)設(shè)值為8
-XX:PretenureSizeThreshold=n 直接晉升到老年代的對象大小淘捡,設(shè)置這個參數(shù)之后,大于這個參數(shù)的對象直接進入到老年代分配
-XX:MaxTenuringThreshold=n 晉升到老年代的對象年齡池摧,每個對象在堅持過一次Minor GC之后焦除,年齡加1,當(dāng)超過這個值之后就進入老年代作彤。預(yù)設(shè)值為15
-XX:+UseAdaptiveSizePolicy 動態(tài)調(diào)整Java堆中各個區(qū)域的大小以及進入老年代的年齡
-XX:ParallelGCThreads=n 設(shè)置并行收集器收集時使用的CPU數(shù)膘魄。并行收集線程數(shù)
-XX:MaxGCPauseMillis=n 設(shè)置并行收集最大暫停時間
-XX:GCTimeRatio=n 設(shè)置垃圾回收時間占程序運行時間的百分比。公式為1/(1+N)
-XX:+UseThreadPriorities 啟用本地線程優(yōu)先級
-XX:-DisableExplicitGC 禁止調(diào)用System.gc()竭讳;但jvm的gc仍然有效
-XX:+MaxFDLimit 最大化文件描述符的數(shù)量限制

前面6個參數(shù)都是關(guān)于垃圾收集器的行為參數(shù)创葡,也是經(jīng)常會用到的參數(shù)。

  • 調(diào)試參數(shù)
參數(shù)及其默認(rèn)值 描述
-XX:-CITime 打印消耗在JIT編譯的時間
-XX:ErrorFile=./hs_err_pid<pid>.log 保存錯誤日志或者數(shù)據(jù)到文件中
-XX:HeapDumpPath=./java_pid<pid>.hprof 指定導(dǎo)出堆信息時的路徑或文件名
-XX:-HeapDumpOnOutOfMemoryError 當(dāng)首次遭遇OOM時導(dǎo)出此時堆中相關(guān)信息
-XX:OnError="<cmd args>;<cmd args>" 出現(xiàn)致命ERROR之后運行自定義命令
-XX:OnOutOfMemoryError="<cmd args>;<cmd args>" 當(dāng)首次遭遇OOM時執(zhí)行自定義命令
-XX:-PrintClassHistogram 遇到Ctrl-Break后打印類實例的柱狀信息绢慢,與jmap -histo功能相同
-XX:-PrintConcurrentLocks 遇到Ctrl-Break后打印并發(fā)鎖的相關(guān)信息灿渴,與jstack -l功能相同
-XX:-PrintCommandLineFlags 打印在命令行中出現(xiàn)過的標(biāo)記
-XX:-PrintCompilation 當(dāng)一個方法被編譯時打印相關(guān)信息
-XX:-PrintGC 每次GC時打印相關(guān)信息
-XX:-PrintGCDetails 每次GC時打印詳細信息
-XX:-PrintGCTimeStamps 打印每次GC的時間戳
-XX:-TraceClassLoading 跟蹤類的加載信息
-XX:-TraceClassLoadingPreorder 跟蹤被引用到的所有類的加載信息
-XX:-TraceClassResolution 跟蹤常量池
-XX:-TraceClassUnloading 跟蹤類的卸載信息
-XX:-TraceLoaderConstraints 跟蹤類加載器約束的相關(guān)信息

5 JDK8的VM參數(shù)

由于考慮到現(xiàn)在JDK8用的非常的廣泛,所以胰舆,接下來總結(jié)一些JDK8會使用到的參數(shù)骚露。

查看這篇JDK8的參數(shù)文章你會發(fā)現(xiàn),標(biāo)準(zhǔn)參數(shù)和非標(biāo)準(zhǔn)參數(shù)JDK8的差別并不是很大思瘟,如果有其他的參數(shù)需要使用荸百,可以查看上面這篇文章。

1滨攻、原創(chuàng)不易够话,老鐵蓝翰,文章需要你的 點贊 讓更多的人看到,希望能夠幫助到大家女嘲!

2畜份、文章有不當(dāng)之處,歡迎指正欣尼,如果喜歡微信閱讀爆雹,你也可以關(guān)注我的微信公眾號好好學(xué)java,公眾號已有 6W 粉絲愕鼓,回復(fù):1024钙态,獲取公眾號的大禮包,公眾號長期發(fā)布 Java 優(yōu)質(zhì)系列文章菇晃,關(guān)注我們一定會讓你收獲很多册倒!

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市磺送,隨后出現(xiàn)的幾起案子驻子,更是在濱河造成了極大的恐慌,老刑警劉巖估灿,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崇呵,死亡現(xiàn)場離奇詭異,居然都是意外死亡馅袁,警方通過查閱死者的電腦和手機域慷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來司顿,“玉大人芒粹,你說我怎么就攤上這事兄纺〈罅铮” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵估脆,是天一觀的道長钦奋。 經(jīng)常有香客問我,道長疙赠,這世上最難降的妖魔是什么付材? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮圃阳,結(jié)果婚禮上厌衔,老公的妹妹穿的比我還像新娘。我一直安慰自己捍岳,他們只是感情好富寿,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布睬隶。 她就那樣靜靜地躺著,像睡著了一般页徐。 火紅的嫁衣襯著肌膚如雪苏潜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天变勇,我揣著相機與錄音恤左,去河邊找鬼。 笑死搀绣,一個胖子當(dāng)著我的面吹牛飞袋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播链患,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼授嘀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锣险?” 一聲冷哼從身側(cè)響起蹄皱,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芯肤,沒想到半個月后巷折,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡崖咨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年锻拘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片击蹲。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡署拟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出歌豺,到底是詐尸還是另有隱情推穷,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布类咧,位于F島的核電站馒铃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痕惋。R本人自食惡果不足惜区宇,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望值戳。 院中可真熱鬧议谷,春花似錦、人聲如沸堕虹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至禀崖,卻和暖如春衩辟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背波附。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工艺晴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掸屡。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓封寞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仅财。 傳聞我的和親對象是個殘疾皇子狈究,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容