日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

JVM內(nèi)存配置最佳實踐

JVM的堆(Heap)占用內(nèi)存過大會引發(fā)如下問題:如果JVM直接運行在Linux系統(tǒng),可能會導(dǎo)致Java進程被Linux系統(tǒng)的OOM Killer所終止(Kill);如果JVM運行在Docker容器環(huán)境,可能會表現(xiàn)為頻繁異常重啟。本文針對在容器環(huán)境下運行JVM的內(nèi)存配置給出建議,并解決OOM(Out of Memory)的相關(guān)常見問題。

通過-XX:MaxRAMPercentage限制JVM使用容器內(nèi)存的最大百分比(推薦)

容器環(huán)境下,推薦的JVM參數(shù)設(shè)置如下:

-XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/admin/nas/gc-${POD_IP}-$(date '+%s').log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprof

參數(shù)說明如下:

參數(shù)

說明

-XX:+UseContainerSupport

設(shè)置JVM檢測所處容器的內(nèi)存大小和處理器數(shù)量,而不是檢測整個操作系統(tǒng)的。

JVM會使用上述檢測到的信息進行資源分配,例如:-XX:InitialRAMPercentage-XX:MaxRAMPercentage所設(shè)置的百分比就是基于此信息進行計算的。

-XX:InitialRAMPercentage

設(shè)置JVM使用容器內(nèi)存的初始百分比。建議與-XX:MaxRAMPercentage保持一致,推薦設(shè)置為70.0,代表JVM初始使用容器內(nèi)存的70%。

-XX:MaxRAMPercentage

設(shè)置JVM使用容器內(nèi)存的最大百分比。由于存在系統(tǒng)組件開銷,建議最大不超過75.0,推薦設(shè)置為70.0,代表JVM最大使用容器內(nèi)存的70%。

-XX:+PrintGCDetails

輸出GC詳細信息。

-XX:+PrintGCDateStamps

輸出GC時間戳。日期形式,例如2019-12-24T21:53:59.234+0800。

-Xloggc:/home/admin/nas/gc-${POD_IP}-$(date '+%s').log

GC日志文件路徑。需保證Log文件所在容器路徑已存在,建議您將該容器路徑掛載到NAS目錄或收集到SLS,以便自動創(chuàng)建目錄以及實現(xiàn)日志的持久化存儲。

-XX:+HeapDumpOnOutOfMemoryError

JVM發(fā)生OOM時,自動生成Dump文件。

-XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprof

Dump文件路徑。需保證Dump文件所在容器路徑已存在,建議您將該容器路徑掛載到NAS目錄,以便自動創(chuàng)建目錄以及實現(xiàn)日志的持久化存儲。

說明
  • 使用-XX:+UseContainerSupport參數(shù)需JDK 8u191+、JDK 10及以上版本。

  • -XX:+UseContainerSupport參數(shù)僅在部分操作系統(tǒng)上支持,具體支持情況請查閱您所使用的Java版本的官方文檔。

  • 在JDK 11及之后的版本中,日志相關(guān)的參數(shù)-XX:+PrintGCDetails-XX:+PrintGCDateStamps-Xloggc:$LOG_PATH/gc.log已被廢棄,請使用參數(shù)-Xlog:gc:$LOG_PATH/gc.log代替。

  • Dragonwell 11不支持${POD_IP}變量。

  • 如果您沒有將/home/admin/nas容器路徑掛載到NAS目錄,則必須保證該目錄在應(yīng)用啟動前已存在,否則將不會產(chǎn)生日志文件。

通過-Xms -Xmx限制堆大小

  • 您可以通過設(shè)置-Xms-Xmx來限制堆大小,但該方式存在以下兩個問題:

    • 當(dāng)實例的規(guī)格大小調(diào)整后,需要重新設(shè)置堆大小參數(shù)。

    • 當(dāng)參數(shù)設(shè)置不合理時,會出現(xiàn)業(yè)務(wù)應(yīng)用內(nèi)存未達到JVM堆大小上限,但容器OOM被強制關(guān)閉的情況。詳見容器出現(xiàn)137退出碼的含義是什么?

  • 推薦的JVM參數(shù)設(shè)置。

    -Xms2048m -Xmx2048m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/admin/nas/gc-${POD_IP}-$(date '+%s').log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprof

    參數(shù)說明如下。

    參數(shù)

    說明

    -Xms

    設(shè)置JVM初始內(nèi)存大小。建議與-Xmx相同,避免每次垃圾回收完成后JVM重新分配內(nèi)存。

    -Xmx

    設(shè)置JVM最大可用內(nèi)存大小。為避免容器OOM,請為系統(tǒng)預(yù)留足夠的內(nèi)存大小。

    -XX:+PrintGCDetails

    輸出GC詳細信息。

    -XX:+PrintGCDateStamps

    輸出GC時間戳。日期形式,例如2019-12-24T21:53:59.234+0800。

    -Xloggc:/home/admin/nas/gc-${POD_IP}-$(date '+%s').log

    GC日志文件路徑。需保證Log文件所在容器路徑已存在,建議您將該容器路徑掛載到NAS目錄或收集到SLS,以便自動創(chuàng)建目錄以及實現(xiàn)日志的持久化存儲。

    -XX:+HeapDumpOnOutOfMemoryError

    JVM發(fā)生OOM時,自動生成Dump文件。

    -XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprof

    Dump文件路徑。需保證Dump文件所在容器路徑已存在,建議您將該容器路徑掛載到NAS目錄,以便自動創(chuàng)建目錄以及實現(xiàn)日志的持久化存儲。

  • 推薦的堆大小設(shè)置。

    內(nèi)存規(guī)格大小

    JVM堆大小

    1 GB

    600 MB

    2 GB

    1434 MB

    4 GB

    2867 MB

    8 GB

    5734 MB

說明
  • 在JDK 11及之后的版本中,日志相關(guān)的參數(shù)-XX:+PrintGCDetails-XX:+PrintGCDateStamps-Xloggc:$LOG_PATH/gc.log已被廢棄,請使用參數(shù)-Xlog:gc:$LOG_PATH/gc.log代替。

  • Dragonwell 11不支持${POD_IP}變量。

  • 如果您沒有將/home/admin/nas容器路徑掛載到NAS目錄,則必須保證該目錄在應(yīng)用啟動前已存在,否則將不會產(chǎn)生日志文件。

通過ossutil下載堆轉(zhuǎn)儲文件

  1. 掛載容器日志目錄至NAS。具體操作,請參見設(shè)置NAS存儲

  2. 設(shè)置JVM參數(shù)。

    其中Dump文件路徑/home/admin/nas為NAS掛載目錄:

    -Xms2048m -Xmx2048m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/admin/nas/gc-${POD_IP}-$(date '+%s').log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprof
  3. 當(dāng)應(yīng)用發(fā)生OOM時,會生成堆轉(zhuǎn)儲文件到NAS掛載目錄,您可以利用ossutil工具,將該Dump文件下載到本地進行分析。具體操作,請參見通過日志上傳下載診斷應(yīng)用

常見問題

容器出現(xiàn)137退出碼的含義是什么?

當(dāng)容器使用內(nèi)存超過限制時,會出現(xiàn)容器OOM,導(dǎo)致容器被強制關(guān)閉。此時業(yè)務(wù)應(yīng)用內(nèi)存可能并未達到JVM堆大小上限,所以不會產(chǎn)生Dump日志。建議您調(diào)小JVM堆大小的上限,為容器內(nèi)其他系統(tǒng)組件預(yù)留足夠多的內(nèi)存空間。m_exitcode_137

為什么發(fā)生OOM卻沒有生成Dump文件?

當(dāng)發(fā)生OOM Killer時,并不一定會發(fā)生JVM OOM,所以不會生成Dump文件。您可以采取以下方式來避免這種情況。

  • 如果是Java應(yīng)用,可以適當(dāng)調(diào)小JVM的堆內(nèi)存大小。具體配置,請參見本文。

  • 如果是非Java應(yīng)用,可以調(diào)整實例規(guī)格,保證充裕的內(nèi)存資源。具體配置,請參見變更實例規(guī)格

堆大小和規(guī)格內(nèi)存的參數(shù)值可以相同嗎?

不可以。因為系統(tǒng)自身組件存在內(nèi)存開銷,例如使用SLS進行日志收集(設(shè)置日志收集至SLS)時會占用一小部分的內(nèi)存空間,所以不能將JVM堆大小設(shè)置為和規(guī)格內(nèi)存大小相同的數(shù)值,需要為這些系統(tǒng)組件預(yù)留足夠的內(nèi)存空間。

在JDK 8版本下設(shè)置-XX:MaxRAMPercentage值為整數(shù)時報錯怎么處理?

這是JDK 8的一個Bug。具體信息,請參見Java Bug Database。例如,在JDK 8u191版本下,設(shè)置-XX:MaxRAMPercentage=70,此時JVM會啟動報錯。m_JDK8_bug

解決方案如下:

  • 方式一:設(shè)置-XX:MaxRAMPercentage70.0

    說明

    如果您使用了-XX:InitialRAMPercentage-XX:MinRAMPercentage,參數(shù)值同樣不可設(shè)置為整數(shù),需按照方式一的形式來設(shè)置。

  • 方式二:升級JDK版本至JDK 10及以上版本。

為什么JVM參數(shù)設(shè)置了6 GB,但是內(nèi)存使用率卻很低?

雖然JVM參數(shù)已設(shè)置-Xms6g -Xmx6g,但是操作系統(tǒng)不會馬上分配6 GB的物理內(nèi)存,需要實際使用后才分配。因此,內(nèi)存使用率在應(yīng)用啟動的時候,會相對較低,后續(xù)會出現(xiàn)攀爬現(xiàn)象。