0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JVM的一些重要參數(shù)

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-09-25 15:56 ? 次閱讀

這一篇內(nèi)容就只有滿滿的干貨,可以說(shuō)是拿來(lái)即用。下面我們廢話少說(shuō),走起。

1.GC算法種類

目前OpenJDK中有以下幾種常見的GC算法。

  • Serial GC
  • Parallel GC
  • CMS GC (Concurrent Mark & Sweep)
  • G1 GC
  • Z GC

目前大多數(shù)的人使用Java8居多。如果沒有明確指定GC算法,那么Java8會(huì)使用默認(rèn)Parallel GC。Java9開始 ,默認(rèn)GC 是G1 GC算法。Java 17 默認(rèn)也是G1 GC,其中個(gè)別版本會(huì)有點(diǎn)差異。

下面是常用GC算法使用命令。

GC AlgorithmJVM argument
Serial GC-XX:+UseSerialGC
Parallel GC-XX:+UseParallelGC
CMS GC-XX:+UseConcMarkSweepGC
G1 GC-XX:+UseG1GC
ZGC-XX:+UseZGC

網(wǎng)上大多數(shù)人都對(duì)ZGC算法的性能比較稱贊,如果是使用Java11以上的版本,那么可以考慮使用ZGC。奈何大多數(shù)同學(xué)們包括筆者都在Java8中久久不能自拔,所以我們這一篇就避開ZGC吧。

2. JVM的一些重要參數(shù)

JVM中的參數(shù)分為3類:

  • 標(biāo)準(zhǔn)參數(shù)(-),所有的JVM都必須實(shí)現(xiàn)這些參數(shù)的功能,并且必須向后兼容. 如java -version等
  • 非標(biāo)準(zhǔn)參數(shù)(-X),默認(rèn)JVM實(shí)現(xiàn)這些功能,不保證所有的JVM都能使用,且不向后兼容。
  • 非Stable參數(shù)(-XX),這些參數(shù)每個(gè)JVM實(shí)現(xiàn)都會(huì)不同,而且將來(lái)可能取消,需要謹(jǐn)慎使用

關(guān)于非標(biāo)準(zhǔn)參數(shù),我們使用 java -X 命令 即可找到這些參數(shù),

  • -Xmn 新生代內(nèi)存大小,包括E區(qū)和兩個(gè)S區(qū),使用方法如下:-Xmn65535,-Xmn2048k,-Xmn512m, -Xmn2g (-Xms,-Xmx 也是同一種寫法)
  • -Xms 初始堆的大小,堆大小的最小值,默認(rèn)值是物理內(nèi)存的1/64(小于1G), 默認(rèn)情況下,如果堆中可用內(nèi)存小于40%時(shí)(調(diào)整參數(shù) -X:MinHeapFreeRatio=40),堆內(nèi)存會(huì)開始增加,一直增加到-Xmx的大小
  • -Xmx 堆的最大值,默認(rèn)是物理內(nèi)存的1/64,如果Xms和Xmx都不設(shè)置的話,兩者的大小會(huì)相同,默認(rèn)情況下,當(dāng)堆中可用內(nèi)存大于70%時(shí)(調(diào)整參數(shù) -X:MaxHeapFreeRatio=70),堆內(nèi)存會(huì)開始減少,一直減少到-Xms的大小
  • -Xss 線程的棧內(nèi)存,默認(rèn)時(shí)1m, 如果項(xiàng)目使用lombok過(guò)多的情況下,編譯的時(shí)候可能會(huì)有棧溢出,就需要配置多一點(diǎn)棧內(nèi)存。
  • -XX:MaxTeurningThreashold 新生代存活對(duì)象晉升到老年代的年齡閾值,對(duì)象頭中存儲(chǔ)age用了4個(gè)bit,所以其最大值為15。默認(rèn)值是15,如果年輕代垃圾回收后總有一段時(shí)間內(nèi)存的占用仍然保持在某一個(gè)高位,過(guò)一段時(shí)間恢復(fù)正常。那么可以適當(dāng)降低年齡閾值,讓存活對(duì)象更早的進(jìn)入到老年代,提高年輕代的可用率。

3.使用哪種GC最合適

既然大多數(shù)同學(xué)都使用Java8,那么一定會(huì)在Parallel GC 和G1 GC中選擇了。

關(guān)于那種GC最合適,我們下面分別來(lái)看看。

3.1 如果選擇ParallelGC

ParallelGC是Java8的默認(rèn)GC算法,對(duì)于新生代其使用Parallel Scavenge (復(fù)制算法),老年代垃圾回收則不同。

有兩種組合:

  • 使用 -XX:UseParallelGC 參數(shù),新生代使用 Parallel Scavenge 垃圾回收算法 ,老年代使用PSMarkSweep(Serial Old)垃圾回收算法(標(biāo)記-整理算法)。
  • 使用 -XX:UseParallelOldGC 參數(shù), 新生代使用 Parallel Scavenge 垃圾回收算法,老年代使用Parallel Old垃圾回收算法(標(biāo)記整理算法)。
3.1.1 Parallel Scavenge

Parallel Scavenge 是新生代并行回收器,使用復(fù)制算法。主要關(guān)注的是吞吐量,吞吐量就是JVM運(yùn)行期間非垃圾回收用時(shí)百分比。

Parallel Scavenge 收集器控制吞吐量有兩個(gè)重要參數(shù):

  • 最大停頓時(shí)間 -XX:MaxGCPauseMills=100
    其值為大于0的毫秒數(shù),垃圾收集器盡可能保證回收的耗時(shí)不超過(guò)設(shè)定的值,但是并不是越小越好,如果值設(shè)置太小,那么GC的頻率會(huì)提高,這樣吞吐量就降低了。
  • 控制吞吐量大小 -XX:GCTimeRatio=99
    其值為0-100的整數(shù),表示吞吐量,默認(rèn)值是99,表示允許1%的垃圾回收時(shí)間占比。
  • -XX:UseAdaptiveSizePolicy 自動(dòng)調(diào)節(jié)新生代大小比例
    啟用這個(gè)參數(shù)之后,JVM會(huì)根據(jù)當(dāng)前系統(tǒng)運(yùn)行情況收集監(jiān)控信息,動(dòng)態(tài)調(diào)整新生代的比例等等。如果設(shè)置了這個(gè)參數(shù)之后,就不需要在設(shè)置新生代大小,Eden以及 S0/S1的比例等參數(shù)。
3.1.2 Parallel Old

Parallel Old 是老年代垃圾回收器,負(fù)責(zé)Full GC ,是一個(gè)并行垃圾回收器,整理老年代的時(shí)候,是基于“標(biāo)記-整理”算法,

Parallel Old算法分為3各部分,

  1. Mark:將老年代的內(nèi)存,劃分為大小固定的多個(gè)連續(xù)的Region,標(biāo)記完存活對(duì)象之后,統(tǒng)計(jì)每個(gè)Region的存活對(duì)象數(shù)量。Mark階段采用串行標(biāo)記所有從GC Roots可直達(dá)的對(duì)象,并行標(biāo)記所有存活的對(duì)象。
  2. Summary:某個(gè)Region的密度 = 存活對(duì)象的內(nèi)存大小/Region內(nèi)存大小,Summary階段會(huì)從左向右計(jì)算各個(gè)Region的密度,然后找到一個(gè)平衡點(diǎn),這個(gè)平衡點(diǎn)左側(cè)的Region都不會(huì)進(jìn)入下一個(gè)回收階段,另外一側(cè)的Region則需要進(jìn)入到下一個(gè)階段進(jìn)行回收。相當(dāng)于只回收部分Region,Summary階段是串行執(zhí)行階段。
  3. Compaction:利用Summary階段的統(tǒng)計(jì)數(shù)據(jù),針對(duì)需要整理的部分,采用“整理”算法進(jìn)行操作
  • -XX:+ScavengeBeforeFullGC ScavengBeforeFullGC 是 Parallel GC中的一個(gè)參數(shù),默認(rèn)開啟。其作用就是在一次FullGC之前先觸發(fā)一次Young GC 來(lái)清理新生代,以降低Full GC時(shí) STW的耗時(shí),
3.1.3 ParallelGC調(diào)優(yōu)

Parallel GC會(huì)盡量去滿足如下目標(biāo):(優(yōu)先級(jí)由高到低)

  • 最大停頓時(shí)間目標(biāo)
  • 吞吐量目標(biāo)
  • 最小移動(dòng)目標(biāo)

對(duì)ParallelGC的調(diào)優(yōu),其目標(biāo)應(yīng)盡可能避免Full GC, 這就需要優(yōu)化對(duì)象老年化的頻率,

使用ParallelGC時(shí),垃圾收集的資源開銷應(yīng)小于5%,如果已經(jīng)減少到1%甚至更少,基本上已經(jīng)達(dá)到極限了。

  • Survivor調(diào)優(yōu):ParallelGC可以自動(dòng)調(diào)整Survivor空間,大部分的程序使用自動(dòng)調(diào)整可以滿足要求,個(gè)別應(yīng)用在需要的情況下可以關(guān)閉自動(dòng)調(diào)整,進(jìn)行手動(dòng)調(diào)整。

    -Xmn1024m   //新生代大小
    -XX:-UseAdaptiveSizePolicy  //關(guān)閉自適應(yīng)調(diào)整
    

    -XX:SurvivorRatio 可以調(diào)整新生代中Survivor與Eden區(qū)的比例,例如-XX:SurvivorRatio=6表示S(From) : S(To) : Eden = 1: 1: 6 。其默認(rèn)值為8

    如果發(fā)現(xiàn)GC頻率過(guò)高,整體新生代又太小,可以增大新生代的大小,從而降低YoungGC的頻率和占用時(shí)間。

    可以調(diào)小 SurvivorRatio的值,在整個(gè)新生代不變的情況下,會(huì)增大Survivor區(qū)的大小(From和To同時(shí)增大)。一般情況下Eden區(qū)的大小應(yīng)該比Survivor大很多,如果大量對(duì)象都在一次YoungGC后就會(huì)回收清理,那么新生代Eden:From:To 為8:1:1就比較合適。如果說(shuō)很大部分對(duì)象的年齡都超過(guò)1,即需要在Survivor的From,To中來(lái)回轉(zhuǎn)換幾次之后才能被回收,那么此時(shí)可以適當(dāng)增大一下Survivor區(qū)的空間,并且可以將Survivor的空間使用率增大,避免對(duì)象年齡增長(zhǎng)過(guò)快,從而被移動(dòng)到老年代,造成FullGC。

-XX:-UseAdaptiveSizePolicy  //需要關(guān)閉Survivor自適應(yīng)
-XX:TargetSurvivorRatio=< n > //Suvivor空間的使用率,默認(rèn)是50%
-XX:MaxTenuringThreshold=15 //存活對(duì)象年齡,默認(rèn)15,
  • 并行線程的優(yōu)化

    -XX:ParallelGCThreads= N >
    

    此參數(shù)設(shè)置年輕代并行收集器的線程數(shù),一般與CPU數(shù)量相等,過(guò)多的線程數(shù)量會(huì)影響垃圾回收以及整個(gè)程序的性能。

    • 默認(rèn)情況下,當(dāng)CPU的數(shù)量小于8,其值等于CPU數(shù)量
    • CPU數(shù)量大于8個(gè),其值等于3+5*CPU數(shù)量 / 8
  • 最大停頓時(shí)間

    -XX:MaxGCPauseMills=< N > //最大停頓時(shí)間,值大于0的毫秒數(shù)
    

    垃圾收集器為了將最大停頓時(shí)間控制在此參數(shù)內(nèi),收集器會(huì)調(diào)整堆的大小和其他的參數(shù)。

    對(duì)于用戶體驗(yàn),停頓越短越好,在服務(wù)端,會(huì)比較注重高并發(fā)和高吞吐量。

  • 控制吞吐量大小

    -XX:GCTimeRatio=99 //吞吐量
    

    其值為0-100的整數(shù),表示吞吐量,默認(rèn)值是99,表示允許1%的垃圾回收時(shí)間占比。暫停時(shí)間越長(zhǎng),那么垃圾回收占用的時(shí)間比越大,可能會(huì)超過(guò)前面的設(shè)定比例。

3.2 如果選擇G1

Garbage-First 垃圾回收器是服務(wù)器類型的垃圾回收器,主要針對(duì)大內(nèi)存多處理器機(jī)器。其主要目標(biāo)也是低暫停時(shí)間,高吞吐量,全局標(biāo)記。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6808

    瀏覽量

    88743
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2966

    瀏覽量

    73815
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2952

    瀏覽量

    104484
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    157

    瀏覽量

    12197
  • JDK
    JDK
    +關(guān)注

    關(guān)注

    0

    文章

    81

    瀏覽量

    16567
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    介紹一些比較重要的運(yùn)放非理想參數(shù)

      除了共模放大系數(shù)以外,實(shí)際的運(yùn)放還有很多非理想參數(shù),這個(gè)小節(jié)我們介紹一些比較重要的運(yùn)放非理想參數(shù),這些非理想參數(shù)對(duì)運(yùn)放電路是否能正確工作
    發(fā)表于 02-02 13:55 ?1822次閱讀
    介紹<b class='flag-5'>一些</b>比較<b class='flag-5'>重要</b>的運(yùn)放非理想<b class='flag-5'>參數(shù)</b>

    jvm參數(shù)配置問(wèn)題怎么解決

    jvm參數(shù)配置問(wèn)題
    發(fā)表于 05-05 17:29

    一些公司晶體管參數(shù)大全

    電子發(fā)燒友為您提供了一些公司晶體管參數(shù)大全,希望對(duì)您的工作學(xué)習(xí)起到定的作用!
    發(fā)表于 06-23 09:38 ?4165次閱讀

    STM32片上Flash讀寫一些重要知識(shí)

    STM32片上Flash讀寫的一些重要知識(shí)
    的頭像 發(fā)表于 03-06 14:54 ?1.1w次閱讀

    ARM Linux中一些重要的宏及地址定義

    ARM Linux中一些重要的宏及地址定義
    的頭像 發(fā)表于 06-22 17:02 ?2693次閱讀

    GMII to RGMII IP核的一些參數(shù)

    大家好!今天給大家介紹下GMII to RGMII IP 核的一些參數(shù)的含義。其他IP核參數(shù)請(qǐng)看文檔pg160。
    的頭像 發(fā)表于 05-25 09:30 ?4038次閱讀
    GMII to RGMII IP核的<b class='flag-5'>一些</b><b class='flag-5'>參數(shù)</b>

    垃圾收集器的JVM參數(shù)配置

    本篇文章我們就來(lái)給大家介紹垃圾收集器的 JVM 參數(shù)配置。 JVM參數(shù)有很多,其實(shí)我們直接使用默認(rèn)的JVM
    的頭像 發(fā)表于 10-09 16:35 ?515次閱讀
    垃圾收集器的<b class='flag-5'>JVM</b><b class='flag-5'>參數(shù)</b>配置

    jvm的dump太大了怎么分析

    分析大型JVM dump文件可能會(huì)遇到的一些挑戰(zhàn)。首先,JVM dump文件通常非常大,可能幾百M(fèi)B或幾個(gè)GB。這是因?yàn)樗鼈儼?b class='flag-5'>JVM的完整內(nèi)存快照,包括堆和棧的所有對(duì)象和線程信息。
    的頭像 發(fā)表于 12-05 11:01 ?2377次閱讀

    jvm調(diào)優(yōu)參數(shù)

    JVM(Java虛擬機(jī))是Java程序的運(yùn)行環(huán)境,它負(fù)責(zé)解釋Java字節(jié)碼并執(zhí)行相應(yīng)的指令。為了提高應(yīng)用程序的性能和穩(wěn)定性,我們可以調(diào)優(yōu)JVM參數(shù)。 JVM調(diào)優(yōu)主要涉及到堆內(nèi)存、垃圾
    的頭像 發(fā)表于 12-05 11:29 ?585次閱讀

    jvm參數(shù)的設(shè)置和jvm調(diào)優(yōu)

    JVM(Java虛擬機(jī))參數(shù)的設(shè)置和調(diào)優(yōu)對(duì)于提高Java應(yīng)用程序的性能和穩(wěn)定性非常重要。在本文中,我們將詳細(xì)介紹JVM參數(shù)的設(shè)置和調(diào)優(yōu)方法。
    的頭像 發(fā)表于 12-05 11:36 ?1356次閱讀

    jvm調(diào)優(yōu)常用命令

    JVM調(diào)優(yōu)是提升Java應(yīng)用性能的一個(gè)重要方面,通過(guò)合理設(shè)置JVM參數(shù)可以達(dá)到優(yōu)化應(yīng)用性能、提高系統(tǒng)穩(wěn)定性的目的。本文將為你詳細(xì)介紹JVM調(diào)
    的頭像 發(fā)表于 12-05 11:43 ?643次閱讀

    jvm調(diào)優(yōu)工具有哪些

    JVM調(diào)優(yōu)是提高Java應(yīng)用程序性能的重要手段,而JVM調(diào)優(yōu)工具則是輔助開發(fā)人員進(jìn)行調(diào)優(yōu)工作的利器。下面將介紹一些常用的JVM調(diào)優(yōu)工具。 J
    的頭像 發(fā)表于 12-05 11:44 ?1003次閱讀

    jvm配置metaspace最大值的參數(shù)

    堆內(nèi)存限制):該參數(shù)用于設(shè)置JVM堆的最大大小。在JVM啟動(dòng)時(shí),可以使用以下命令來(lái)配置Metaspace的最大大?。?java -Xmx ... 其中,``可以是一些表示大小的標(biāo)記
    的頭像 發(fā)表于 12-05 14:21 ?1905次閱讀

    weblogic jvm參數(shù)配置

    ,讓我們來(lái)了解一些常用的JVM參數(shù): -Xms 和 -Xmx參數(shù):這些參數(shù)分別用于設(shè)置Java虛擬機(jī)的初始堆大小和最大堆大小。-Xms設(shè)置初
    的頭像 發(fā)表于 12-05 14:31 ?1306次閱讀

    weblogic控制臺(tái)配置jvm參數(shù)

    將詳細(xì)介紹如何在WebLogic控制臺(tái)中配置JVM參數(shù),并提供一些常見的配置建議。 首先,我們需要了解JVM參數(shù)對(duì)應(yīng)的不同類型。
    的頭像 發(fā)表于 12-05 14:48 ?2539次閱讀