最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM與容器化部署調(diào)優(yōu)過程(Docker+K8s)

 更新時間:2025年07月04日 14:38:23   作者:zhangxzq  
這篇文章主要介紹了JVM與容器化部署調(diào)優(yōu)過程(Docker+K8s),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

前言

隨著微服務(wù)和容器化架構(gòu)的廣泛應(yīng)用,Java 應(yīng)用越來越多地部署在 Docker 容器和 Kubernetes 集群中。然而,JVM 的默認(rèn)配置是為傳統(tǒng)物理環(huán)境設(shè)計的,在容器中若不進(jìn)行調(diào)優(yōu),可能會遇到以下問題:

  • 容器內(nèi)存限制為 512MB,但 JVM 默認(rèn)使用 2GB,導(dǎo)致上線即被 OOMKilled;
  • 設(shè)置了容器 CPU 限制,但 GC 和編譯線程數(shù)仍默認(rèn)讀取主機(jī)物理核數(shù),引發(fā)資源爭搶;
  • 缺乏 GC 日志和 OOM 信息,系統(tǒng)直接終止進(jìn)程,排查問題如同盲人摸象。

本文將系統(tǒng)介紹 JVM 的容器感知機(jī)制、容器場景下的調(diào)優(yōu)參數(shù)以及真實(shí)案例解析,幫助解決容器中 Java 應(yīng)用難調(diào)、難穩(wěn)、難排障的問題。

容器環(huán)境下 JVM 面臨的新挑戰(zhàn)

在 Docker / K8s 下運(yùn)行 JVM,主要面臨三大挑戰(zhàn):

  • 資源認(rèn)知錯位:JVM 默認(rèn)讀取宿主機(jī)資源,導(dǎo)致堆內(nèi)存和線程數(shù)遠(yuǎn)超容器限制。
  • 系統(tǒng)行為不可控:容器資源耗盡時,Linux 會直接終止 JVM,無任何錯誤棧。
  • 調(diào)優(yōu)難點(diǎn)增多:GC、元空間、本地內(nèi)存、線程棧等因素相互作用,配置不當(dāng)易導(dǎo)致崩潰。

例如:

resources:
  limits:
    memory: 512Mi

若未設(shè)置 -Xmx,JVM 會默認(rèn)使用物理機(jī)內(nèi)存的 25%,可能導(dǎo)致 OOM 被系統(tǒng)終止。

JVM 的容器資源感知機(jī)制詳解

支持版本

  • JDK 8u191+
  • JDK 11+
  • 默認(rèn)支持 CGroup v1 和 v2,無需額外參數(shù)

JVM 如何識別資源

  • 內(nèi)存識別:讀取 /sys/fs/cgroup/memory/memory.limit_in_bytes
  • CPU 核心識別:讀取 /sys/fs/cgroup/cpu/cpu.cfs_quota_uscpu.cfs_period_us
  • 線程數(shù)估算:通過 CPU 核數(shù)推導(dǎo) GC 和編譯器線程數(shù)量
java -XshowSettings:system -version

輸出示例:

Memory:
    MaxHeapSize (Estimated): 268.44 MB
CPU:
    totalProcessorCount = 2

JVM 內(nèi)存調(diào)優(yōu):如何正確使用堆內(nèi)存

錯誤示例(默認(rèn)配置):

容器限制 1GB,JVM 默認(rèn)使用物理內(nèi)存 * 25%,實(shí)際分配超出,觸發(fā)系統(tǒng)終止。

推薦配置方式:

方法一:顯式指定堆大小

-Xms512m -Xmx512m

方法二:使用容器感知參數(shù)

-XX:+UseContainerSupport
-XX:MaxRAMPercentage=70.0
-XX:InitialRAMPercentage=70.0

建議 MaxRAMPercentage 不超過 75%,需預(yù)留線程棧、本地緩存、CodeCache 等區(qū)域。

JVM CPU 調(diào)優(yōu):GC 與編譯線程控制

容器限制 1 核,GC 卻啟動 8 個線程?C2 編譯器開了 6 個線程?

這會導(dǎo)致:

  • JVM 搶占過多 CPU,影響同節(jié)點(diǎn)其他 Pod
  • 容器 CPU 限流,應(yīng)用性能抖動

推薦參數(shù)

調(diào)優(yōu)點(diǎn)參數(shù)示例
限制可用核心數(shù)-XX:ActiveProcessorCount=1強(qiáng)制 JVM 只使用 1 核
GC 并發(fā)線程數(shù)-XX:ParallelGCThreads=1 -XX:ConcGCThreads=1針對 G1/CMS
JIT 編譯器線程-XX:CICompilerCount=2防止編譯爆 CPU

Kubernetes 典型配置誤區(qū)與對策

錯誤做法影響正確配置
不配置 -Xmx,默認(rèn)用宿主機(jī)內(nèi)存容器超內(nèi)存被終止顯式設(shè)置堆大小或使用 MaxRAMPercentage
容器限 1 核,GC 用了 8 個線程CPU 抖動,GC STW 時間長使用 ActiveProcessorCount 限制
小內(nèi)存容器使用 G1 GCGC 頻繁,吞吐下降推薦 Parallel GC(Serial)

實(shí)戰(zhàn)案例:OOMKilled 真相調(diào)查

現(xiàn)象

  • K8s 中 Pod 隨機(jī)重啟
  • 日志中沒有任何 OOM 棧信息
  • kubectl describe pod 發(fā)現(xiàn):
State:      Terminated
Reason:     OOMKilled

排查過程

  • 查看 JVM 啟動命令,發(fā)現(xiàn)未設(shè)置 -Xmx;
  • 宿主機(jī)為 16Gi,而容器限制為 1Gi;
  • JVM 默認(rèn)使用 25%,即 4Gi;
  • 觸發(fā) Linux OOM Killer,進(jìn)程直接被殺。

解決方案

-XX:+UseContainerSupport
-XX:MaxRAMPercentage=70.0

配合 GC 日志輸出:

-Xlog:gc*:stdout:time,uptime,level,tags

容器化 JVM 調(diào)優(yōu)建議清單(Checklist)

  • 使用 JDK 11+,默認(rèn)支持容器感知
  • 顯式或比例方式控制內(nèi)存使用
  • 控制 CPU 核數(shù)、GC 線程、編譯器線程數(shù)
  • GC 日志輸出至 stdout,方便采集與分析
  • Prometheus + Grafana 監(jiān)控 JVM Heap 使用率
  • 為不同容器規(guī)格選擇合適 GC 策略
  • 避免使用實(shí)驗(yàn)性 JVM 參數(shù)
  • 使用探針(liveness/readiness)檢測 JVM 是否假死

總結(jié):容器環(huán)境是 JVM 的“新戰(zhàn)場”

容器環(huán)境帶來靈活性的同時,也帶來了不可見性。傳統(tǒng) JVM 調(diào)優(yōu)經(jīng)驗(yàn)若不進(jìn)行調(diào)整,極易踩坑。

我們要做到:

  • 理解 JVM 如何“看”容器
  • 通過參數(shù)管控其“行為”
  • 構(gòu)建監(jiān)控與排障體系保障穩(wěn)定性

JVM 在容器化部署下不再是“黑盒”,掌握參數(shù)機(jī)制,理解運(yùn)行模型,是構(gòu)建現(xiàn)代 Java 應(yīng)用穩(wěn)定性的基石。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Windows?Docker?Desktop磁盤空間清理步驟完全指南

    Windows?Docker?Desktop磁盤空間清理步驟完全指南

    Windows?Docker?Desktop在長時間使用后,會由于鏡像、容器、緩存等文件累積,導(dǎo)致磁盤空間占用過大,這篇文章主要介紹了Windows?Docker?Desktop磁盤空間清理的相關(guān)資料,需要的朋友可以參考下
    2026-04-04
  • docker安裝部署 onlyoffice的詳細(xì)過程

    docker安裝部署 onlyoffice的詳細(xì)過程

    本文給大家分享docker安裝部署 onlyoffice的詳細(xì)過程,通過圖文并茂實(shí)例相結(jié)合給大家分享安裝Docker Desktop及如何進(jìn)入BIOS設(shè)置CPU的虛擬化,感興趣的朋友一起看看吧
    2021-06-06
  • Docker一鍵部署SpringBoot項(xiàng)目的多種方式

    Docker一鍵部署SpringBoot項(xiàng)目的多種方式

    這篇文章主要介紹了Docker一鍵部署SpringBoot項(xiàng)目的多種方式,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • docker空間爆滿導(dǎo)致的進(jìn)入容器失敗的解決方案

    docker空間爆滿導(dǎo)致的進(jìn)入容器失敗的解決方案

    這篇文章主要介紹了docker空間爆滿導(dǎo)致的進(jìn)入容器失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Docker中的容器網(wǎng)絡(luò)以及其配置說明

    Docker中的容器網(wǎng)絡(luò)以及其配置說明

    這篇文章主要介紹了Docker中的容器網(wǎng)絡(luò)以及其配置說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Docker部署verdaccio搭建npm私服的實(shí)現(xiàn)

    Docker部署verdaccio搭建npm私服的實(shí)現(xiàn)

    本女王主要介紹了Docker部署verdaccio搭建npm私服的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • 利用docker部署nextcloud 網(wǎng)盤的方法步驟

    利用docker部署nextcloud 網(wǎng)盤的方法步驟

    NextCloud 你可以在自己的計算機(jī)上共享任何文件或文件夾,并將它們與 NextCloud 服務(wù)器同步。這篇文章主要介紹了利用docker部署nextcloud 網(wǎng)盤的方法步驟,非常具有實(shí)用價值,需要的朋友可以參考下
    2018-11-11
  • docker?掛載、修改文件的步驟

    docker?掛載、修改文件的步驟

    這篇文章主要介紹了docker?掛載、修改文件的步驟,咱們使用的是docker的 copy 命令從容器中 copy 出來相關(guān)的配置文件,在本地修改,修改完畢在使用docker的 copy 命令從本地 copy 到容器中,重啟容器生效的,需要的朋友可以參考下
    2023-03-03
  • docker desktop實(shí)現(xiàn)一分鐘部署searxng

    docker desktop實(shí)現(xiàn)一分鐘部署searxng

    這篇文章主要介紹了docker desktop實(shí)現(xiàn)一分鐘部署searxng,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 詳解如何將java項(xiàng)目打包成docker鏡像并且可運(yùn)行

    詳解如何將java項(xiàng)目打包成docker鏡像并且可運(yùn)行

    java?項(xiàng)目打包成?Docker?可運(yùn)行的鏡像,其目的是便于運(yùn)用docker容器來管理項(xiàng)目,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2024-11-11

最新評論

清镇市| 阿坝| 合肥市| 湘乡市| 彩票| 山东省| 和龙市| 绥宁县| 航空| 教育| 延庆县| 法库县| 浦城县| 湖南省| 洞口县| 资兴市| 耒阳市| 垦利县| 永安市| 周口市| 甘南县| 明溪县| 盖州市| 永登县| 玛纳斯县| 太谷县| 凉城县| 裕民县| 孝昌县| 汝南县| 石林| 兴业县| 北票市| 华坪县| 武平县| 股票| 南部县| 丹江口市| 库车县| 汉川市| 小金县|