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

Java生產(chǎn)環(huán)境JVM調(diào)優(yōu)的實(shí)戰(zhàn)指南

 更新時間:2026年05月27日 08:36:37   作者:超夢dasgg  
JVM調(diào)優(yōu)關(guān)鍵在于降低GC停頓、避免OOM、提升吞吐量,確保服務(wù)穩(wěn)定,本文通過4個實(shí)戰(zhàn)案例詳細(xì)解析JVM調(diào)優(yōu)流程及核心參數(shù)配置,覆蓋電商、支付、微服務(wù)等常見場景,需要的朋友可以參考下

JVM 調(diào)優(yōu)核心目標(biāo):降低 GC 頻率 / 停頓時間、避免 OOM、提升吞吐量、保證服務(wù)穩(wěn)定。生產(chǎn)環(huán)境調(diào)優(yōu)一定遵循:監(jiān)控定位 → 分析問題 → 參數(shù)調(diào)整 → 驗(yàn)證效果 閉環(huán),絕不盲目加參數(shù)。

本文會用生產(chǎn)真實(shí)場景,從基礎(chǔ)流程到 4 個典型實(shí)戰(zhàn)案例,手把手講透。

一、生產(chǎn) JVM 調(diào)優(yōu)前置知識(必須掌握)

1. 核心調(diào)優(yōu)指標(biāo)(生產(chǎn)看這 4 個就夠)

  1. GC 停頓時間(STW):越短越好(電商 / 支付 < 200ms,日志 / 批處理可放寬)
  2. GC 頻率:YGC 盡量頻繁但快,F(xiàn)GC/FullGC越少越好(最好 0)
  3. 內(nèi)存使用率:老年代不持續(xù)上漲、無內(nèi)存泄漏
  4. 吞吐量:用戶代碼執(zhí)行時間 /(用戶代碼 + GC 時間),越高越好

2. 必備監(jiān)控工具(生產(chǎn)標(biāo)配)

  • 實(shí)時查看:jstat -gc PID 1000 10(最常用,看 GC 次數(shù) / 耗時)
  • 內(nèi)存 dump:jmap -dump:format=b,file=heap.hprof PID(OOM 必用)
  • 日志分析:開啟-XX:+PrintGCDetailsGC 日志,用GCViewer/GCEasy分析
  • 可視化:Arthas(阿里開源,生產(chǎn)首選,無侵入)、Prometheus+Grafana

3. 核心 JVM 參數(shù)(生產(chǎn)常用,無廢話)

# 基礎(chǔ)內(nèi)存配置(必配)
-Xms4g        # 初始堆 = 最大堆,避免擴(kuò)容停頓,生產(chǎn)強(qiáng)制相等
-Xmx4g        # 最大堆
-Xss1024k     # 線程棧大小,默認(rèn)1M足夠,遞歸深可調(diào)大
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
# GC算法(生產(chǎn)主流:JDK8用CMS,JDK11+用G1,ZGC)
-XX:+UseConcMarkSweepGC  # JDK8 低延遲首選
-XX:+UseG1GC             # JDK11+ 默認(rèn),平衡吞吐量/延遲
# GC日志(生產(chǎn)必須開啟,排查問題救命用)
-Xloggc:/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+UseGCLogFileRotation
-XX:GCLogFileSize=100M
# 異常保護(hù)(必配)
-XX:+HeapDumpOnOutOfMemoryError  # OOM自動dump內(nèi)存快照
-XX:HeapDumpPath=/logs/heap.hprof

二、標(biāo)準(zhǔn)生產(chǎn)調(diào)優(yōu)流程(固定 5 步)

  1. 監(jiān)控發(fā)現(xiàn)問題:YGC 頻繁、FGC 不斷、CPU 高、OOM
  2. 分析根因:內(nèi)存泄漏?對象創(chuàng)建太快?堆太???老年代囤積?
  3. 調(diào)整參數(shù):只改 1-2 個參數(shù),不一次性堆參數(shù)
  4. 壓測 / 觀察:觀察 GC 指標(biāo)變化
  5. 固化最優(yōu)配置:穩(wěn)定后保留參數(shù),寫入 Docker/K8s 啟動腳本

三、4 個生產(chǎn)最典型的 JVM 調(diào)優(yōu)實(shí)戰(zhàn)案例

案例 1:YGC 頻繁,但單次停頓短(高頻小對象場景)

場景描述

  • 微服務(wù)接口 QPS 高,大量創(chuàng)建局部對象(DTO、List、Map)
  • jstat顯示:YGC 每 1-2 秒一次,每次 < 10ms,F(xiàn)GC 0
  • 服務(wù)無卡頓,但 GC 消耗 CPU 資源

根因

新生代(Eden+S 區(qū))太小,對象快速占滿 Eden,觸發(fā)頻繁 YGC。

調(diào)優(yōu)方案

增大新生代空間,降低 YGC 頻率:

# 原配置
-Xms2g -Xmx2g
# 調(diào)優(yōu)后(新生代占堆 1/2,默認(rèn)是 1/3)
-Xms2g -Xmx2g -Xmn1g

效果

YGC 頻率從1 次 / 秒 → 1 次 / 10 秒,GC CPU 使用率下降,服務(wù)更穩(wěn)定。

案例 2:頻繁 FullGC,服務(wù)卡頓、超時(最危險場景)

場景描述

  • 訂單 / 支付核心服務(wù),突然接口大量超時
  • jstat顯示:FGC 幾分鐘一次,不斷增長,單次停頓 500ms+
  • 堆內(nèi)存:老年代持續(xù) 100% 占用

常見根因

  1. 內(nèi)存泄漏(連接未關(guān)閉、靜態(tài)集合緩存對象)
  2. 對象直接進(jìn)入老年代(大對象 / 動態(tài)晉升)
  3. 老年代空間不足

排查步驟

  1. 導(dǎo)出堆 dump:jmap -dump:format=b,file=oom.hprof PID
  2. 用 MAT 工具分析:發(fā)現(xiàn)靜態(tài) Map 緩存了大量訂單對象,未清理 → 內(nèi)存泄漏

調(diào)優(yōu)方案

  1. 代碼修復(fù):給緩存加過期時間、使用弱引用 / 本地緩存框架(Caffeine)
  2. JVM 參數(shù)輔助
# 增大堆,調(diào)整CMS觸發(fā)閾值,提前回收
-Xms4g -Xmx4g
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70  # 老年代占70%觸發(fā)CMS,避免滿了再GC
-XX:+UseCMSInitiatingOccupancyOnly

效果

FGC 降為0 / 天,GC 停頓 < 100ms,服務(wù)無卡頓。

案例 3:大對象導(dǎo)致頻繁 YGC+FGC(文件 / 圖片 / 報文處理)

場景描述

  • 服務(wù)處理 Excel 導(dǎo)入、大報文解析,創(chuàng)建幾 MB 的大對象
  • JVM 報錯:Preventing promotion of large object
  • YGC 和 FGC 同時頻繁,OOM 頻發(fā)

根因

大對象直接進(jìn)入老年代,Eden 放不下,老年代快速被占滿。

調(diào)優(yōu)方案

  1. 代碼優(yōu)化:拆分大對象,流式處理,不一次性加載全量數(shù)據(jù)
  2. JVM 參數(shù)
# 1. 調(diào)大大對象閾值,讓大對象優(yōu)先在新生代分配
-XX:PretenureSizeThreshold=10m  # >10M才直接進(jìn)老年代
# 2. 增大新生代
-Xms4g -Xmx4g -Xmn2g

效果

大對象不再直接進(jìn)入老年代,F(xiàn)GC 消失,OOM 解決。

案例 4:G1GC 調(diào)優(yōu)(JDK11 + 微服務(wù)通用場景)

場景描述

  • SpringCloud 微服務(wù),JDK11,默認(rèn) G1GC
  • 偶爾出現(xiàn)GC 停頓超過 300ms,接口超時
  • 堆內(nèi)存 4G,無內(nèi)存泄漏

根因

G1 默認(rèn)目標(biāo)停頓200ms,未根據(jù)業(yè)務(wù)調(diào)整,混合回收效率低。

調(diào)優(yōu)方案

G1 調(diào)優(yōu)只改一個核心參數(shù):期望停頓時間

-Xms4g -Xmx4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100  # 目標(biāo)停頓<100ms,G1自動調(diào)整分區(qū)大小
-XX:ConcGCThreads=4       # 根據(jù)CPU核心數(shù)調(diào)整

效果

GC 平均停頓 **<80ms**,無明顯波動,服務(wù)穩(wěn)定。

四、生產(chǎn) JVM 參數(shù)最佳實(shí)踐模板(直接復(fù)制用)

1. JDK8 低延遲服務(wù)(支付 / 電商)

JAVA_OPTS="
-Xms4g -Xmx4g -Xmn2g
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
-Xloggc:/logs/gc.log
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/
"

2. JDK11+ 微服務(wù)(通用最優(yōu))

JAVA_OPTS="
-Xms4g -Xmx4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-Xlog:gc*:/logs/gc.log:time,level,tags
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/
"

五、避坑指南(生產(chǎn) 90% 的人踩過)

  1. 不要堆參數(shù):一次只改 1 個參數(shù),觀察效果
  2. -Xms 必須等于 - Xmx:避免堆擴(kuò)容導(dǎo)致的長時間停頓
  3. 不要無限加大堆:堆越大,F(xiàn)GC 停頓越長,4-8G 最均衡
  4. 先修代碼,再調(diào) JVM:內(nèi)存泄漏、大對象靠調(diào)優(yōu)解決不了
  5. 必須開 GC 日志和 OOM dump:出問題能快速定位

總結(jié)

  1. JVM 調(diào)優(yōu)核心:先監(jiān)控定位,再小步調(diào)整,不盲目操作
  2. 生產(chǎn)高頻問題:YGC 頻繁(加新生代)、FGC 頻繁(內(nèi)存泄漏 / 老年代不足)、大對象
  3. 最優(yōu)方案:代碼優(yōu)化為主,JVM 參數(shù)為輔,配合 GC 日志 + Arthas 工具
  4. 直接可用:兩套參數(shù)模板適配 JDK8/JDK11,覆蓋絕大多數(shù)微服務(wù)場景

以上就是Java生產(chǎn)環(huán)境JVM調(diào)優(yōu)的實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Java生產(chǎn)環(huán)境JVM調(diào)優(yōu)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java方法遞歸的形式和常見遞歸算法(方法遞歸結(jié)合File類查找文件)

    Java方法遞歸的形式和常見遞歸算法(方法遞歸結(jié)合File類查找文件)

    方法遞歸方法直接調(diào)用自己或者間接調(diào)用自己的形式稱為方法遞歸( recursion),遞歸做為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用,這篇文章主要介紹了Java方法遞歸的形式和常見遞歸算法-方法遞歸結(jié)合File類查找文件,需要的朋友可以參考下
    2023-02-02
  • spring 自動注入AutowiredAnnotationBeanPostProcessor源碼解析

    spring 自動注入AutowiredAnnotationBeanPostProcessor源碼解析

    這篇文章主要介紹了spring自動注入AutowiredAnnotationBeanPostProcessor源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • SpringMVC+Mysql實(shí)例詳解(附demo)

    SpringMVC+Mysql實(shí)例詳解(附demo)

    本篇文章主要介紹了SpringMVC+Mysql實(shí)例詳解(附demo),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。
    2016-12-12
  • JAVA?DOC如何生成標(biāo)準(zhǔn)的JAVA?API文檔詳解

    JAVA?DOC如何生成標(biāo)準(zhǔn)的JAVA?API文檔詳解

    這篇文章主要給大家介紹了關(guān)于JAVA?DOC如何生成標(biāo)準(zhǔn)的JAVA?API文檔的相關(guān)資料,Javadoc是Sun公司提供的一種工具,它可以從程序源代碼中抽取類、方法、成員等注釋,然后形成一個和源代碼配套的API幫助文檔,需要的朋友可以參考下
    2024-06-06
  • JAVA日志框架之JUL、JDK原生日志框架詳解

    JAVA日志框架之JUL、JDK原生日志框架詳解

    Java語言的強(qiáng)大之處就是因?yàn)樗鼜?qiáng)大而且成熟的生態(tài)體系,其中包括日志框架,下面這篇文章主要給大家介紹了關(guān)于JAVA日志框架之JUL、JDK原生日志框架的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • java實(shí)現(xiàn)163郵箱發(fā)送郵件到qq郵箱成功案例

    java實(shí)現(xiàn)163郵箱發(fā)送郵件到qq郵箱成功案例

    這篇文章主要為大家分享了java實(shí)現(xiàn)163郵箱發(fā)送郵件到qq郵箱成功案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • springBoot整合rabbitMQ的方法詳解

    springBoot整合rabbitMQ的方法詳解

    這篇文章主要介紹了springBoot整合rabbitMQ的方法詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 教你怎么用Idea打包jar包

    教你怎么用Idea打包jar包

    這篇文章主要介紹了教你怎么用Idea打包jar包,文中有非常詳細(xì)的代碼示例,對剛開始使用IDEA的小伙伴們很有幫助喲,需要的朋友可以參考下
    2021-05-05
  • tk-mybatis 的使用方法詳解

    tk-mybatis 的使用方法詳解

    tkmybatis是在mybatis框架的基礎(chǔ)上提供了很多工具,本文就詳細(xì)的介紹了一下tk-mybatis 的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • HashMap線程不安全問題解析

    HashMap線程不安全問題解析

    這篇文章主要介紹了HashMap線程不安全問題解析,HashMap的線程不安全體現(xiàn)在會造成死循環(huán)、數(shù)據(jù)丟失、數(shù)據(jù)覆蓋等問題,其中死循環(huán)和數(shù)據(jù)丟失是在JDK1.7中出現(xiàn)的問題,在JDK1.8中已經(jīng)得到解決,但是1.8中仍會有數(shù)據(jù)覆蓋這樣的問題,需要的朋友可以參考下
    2023-11-11

最新評論

开远市| 富平县| 方正县| 惠来县| 兴城市| 吉水县| 桃江县| 徐闻县| 临夏市| 淮安市| 行唐县| 连南| 张家口市| 新泰市| 武威市| 海城市| 江川县| 绥化市| 尼木县| 新民市| 双牌县| 故城县| 健康| 韩城市| 汝州市| 房山区| 扶绥县| 辛集市| 聂拉木县| 宜兴市| 成武县| 微博| 无极县| 海原县| 怀宁县| 泌阳县| 麟游县| 环江| 永仁县| 元江| 营口市|