如何監控和調優JVM的內存使用情況?

監控和調優 JVM 內存使用是保障 Java 應用穩定性和性能的核心手段,需要結合監控工具關鍵指標分析針對性調優策略。以下是具體的實施方法:

一、JVM 內存監控:工具與核心指標

監控的目標是掌握內存使用趨勢、GC 行為、線程狀態等,為調優提供數據依據。

1. 常用監控工具

根據場景選擇工具(命令行工具適合服務器環境,可視化工具適合本地分析):

工具類型工具名稱核心用途
命令行工具jps查看當前運行的 JVM 進程 ID(如jps -l顯示進程 ID 和主類)。
jstat實時監控 GC 統計信息(如堆內存使用、GC 次數 / 耗時)。
jmap生成堆內存快照(用于分析對象分布)、查看堆配置(如jmap -heap <pid>)。
jstack導出線程棧信息(排查線程阻塞、死鎖,輔助分析內存使用異常)。
jconsole簡易圖形化工具(監控堆內存、線程、類加載,適合快速排查)。
可視化工具VisualVM全能工具(集成監控、堆快照分析、GC 日志查看,支持插件擴展)。
MAT(Memory Analyzer)深度分析堆快照(定位內存泄漏、大對象,生成內存泄漏報告)。
GCEasy在線 / 離線分析 GC 日志(可視化 GC 頻率、停頓時間,生成優化建議)。
APM 工具Arthas阿里開源診斷工具(動態查看內存、GC、線程,無需重啟應用)。
Prometheus + Grafana分布式環境下的長期監控(結合jmx_exporter采集 JVM 指標,繪制趨勢圖表)。
2. 核心監控指標

需重點關注以下指標,判斷內存使用是否健康:

  • 堆內存指標

    • 年輕代(Eden、S0、S1)和老年代的使用率(是否持續增長至滿);
    • 對象晉升速率(短期對象是否頻繁進入老年代)。
  • GC 指標

    • Minor GC(年輕代回收):頻率(如每秒幾次)和單次耗時(如平均 50ms);
    • Full GC(老年代回收):頻率(如每小時幾次,過于頻繁則異常)和單次耗時(如超過 1s 可能影響服務);
    • GC overhead(GC 耗時占總運行時間的比例,超過 20% 需警惕)。
  • 元空間指標

    • 元空間使用率(是否持續增長,可能因類加載過多導致 OOM)。
  • 線程指標

    • 線程總數(是否超過預期,可能導致棧內存耗盡);
    • 阻塞 / 等待線程數(是否有死鎖、資源競爭)。
  • 異常指標

    • 內存溢出日志(OutOfMemoryError)、棧溢出(StackOverflowError)的出現頻率和觸發場景。

二、JVM 內存調優:步驟與策略

調優需遵循 “監控→分析→調整→驗證” 的閉環流程,避免盲目修改參數。

1. 明確調優目標

根據應用場景確定優先級:

  • Web 服務:優先保證低延遲(GC 停頓短)、高并發(線程穩定);
  • 批處理任務:優先保證高吞吐量(GC 總耗時占比低);
  • 嵌入式應用:優先控制內存占用(避免超出設備資源)。
2. 定位內存問題(常見場景與分析)

基于監控數據,識別典型問題并定位根源:

問題場景特征表現可能原因分析工具 / 方法
頻繁 Minor GC年輕代使用率快速達滿,Minor GC 每秒數次年輕代過小;短期對象創建過快jstat -gc <pid> 1000(實時看 GC 頻率)
頻繁 Full GC老年代使用率持續增長,Full GC 幾分鐘一次內存泄漏;老年代過小;對象過早晉升堆快照(jmap -dump)+ MAT 分析
Full GC 耗時過長單次 Full GC 超過 1s,服務超時老年代過大;GC 收集器選擇不當(如 Serial GC)GC 日志(-XX:+PrintGCDetails
元空間 OOM拋出OutOfMemoryError: Metaspace動態生成類過多(如反射、CGLIB);元空間上限過低jstat -gcmetacapacity <pid>
線程創建失敗拋出OutOfMemoryError: unable to create new native thread線程棧過大(-Xss);總線程數過多jstack <pid>查看線程數
內存泄漏老年代使用率持續上升,Full GC 后不下降無用對象被長期引用(如靜態集合未清理)MAT 分析堆快照(查找支配樹大對象)
3. 針對性調優策略

根據問題場景調整參數或優化代碼:

  • 堆內存調優

    • 若頻繁 Minor GC:增大年輕代(如調小-XX:NewRatio,或直接設置-XX:MaxNewSize);
    • 若頻繁 Full GC 且無泄漏:增大老年代(調大-XX:NewRatio,或直接增大-Xmx);
    • 若對象過早晉升:調大 Survivor 區(減小-XX:SurvivorRatio),或提高晉升年齡(-XX:MaxTenuringThreshold=15)。
  • GC 收集器調優

    • 低延遲需求(如 Web 服務):使用 G1(-XX:+UseG1GC)并限制停頓時間(-XX:MaxGCPauseMillis=200);
    • 高吞吐量需求(如批處理):使用 Parallel GC(-XX:+UseParallelGC);
    • 超大堆場景(如 32GB+):使用 ZGC(-XX:+UseZGC)或 Shenandoah GC,避免 Full GC 卡頓。
  • 元空間調優

    • 若頻繁元空間 GC:調大初始閾值(-XX:MetaspaceSize=128m);
    • 若元空間 OOM:調大上限(-XX:MaxMetaspaceSize=512m),并優化類加載(如減少動態代理生成)。
  • 線程棧調優

    • 若棧溢出(StackOverflowError):增大-Xss(如-Xss1m);
    • 若線程創建失敗:減小-Xss(如-Xss256k),并控制線程池大小。
  • 內存泄漏修復

    • 通過 MAT 的 “支配樹” 功能定位泄漏對象(如未清理的HashMapThreadLocal);
    • 修復代碼:移除無用引用(如remove()而非clear())、使用弱引用(WeakHashMap)等。
4. 驗證調優效果

調整后需對比優化前后的指標:

  • jstat監控 GC 頻率和耗時是否降低;
  • VisualVM觀察堆內存使用率是否穩定;
  • 記錄應用吞吐量(如 TPS)、響應時間是否改善;
  • 持續觀察 1-2 個業務周期(如一天),確認無新問題(如 OOM 復現)。

三、關鍵實踐:日志與基線

  1. 開啟 GC 日志:通過參數記錄 GC 詳情,為分析提供依據:

    bash

    -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/path/to/gc.log
    

    (JDK 9 + 使用統一日志格式:-Xlog:gc*:file=/path/to/gc.log:time

  2. 建立性能基線:在應用穩定期記錄正常指標(如 GC 頻率、堆使用率),作為調優對比的基準。

  3. 避免過度調優:若應用性能達標(如 GC 停頓 < 100ms,無 OOM),無需盲目調整參數,保持默認配置可能更穩定。

總結

JVM 內存監控與調優的核心是 “數據驅動”:通過工具捕獲真實運行指標,定位問題根源(而非猜測),結合應用特性調整參數或優化代碼,最終通過長期監控驗證效果。這一過程需要反復迭代,平衡內存使用、GC 效率和業務需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94785.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94785.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94785.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

把用戶輸進來的明文密碼做一層 MD5 哈希

這一行干的就是&#xff1a;把用戶輸進來的明文密碼先做一層 MD5 哈希&#xff0c;再把得到的 32 位十六進制字符串存到變量 password 里。 逐段拆開&#xff1a;password.getBytes() 把字符串轉成字節數組&#xff0c;MD5 算法只能對字節/字節數組做運算。DigestUtils.md5Dige…

jeecg-boot3.7.0對接釘釘登錄(OAuth2.0)

當前的jeecg-boot 是3.7.0前端問題&#xff1a;1.前端的路由vue-router的版本需要固定死。要不然會報page_not_found router the same.這種奇奇怪怪的問題。 就是把package.json的“^”&#xff0c;這個符號&#xff0c;刪掉。&#xff08;或者全局搜索&#xff0c;這個page no…

【C#】獲取不重復的編碼(遞增,非GUID)

獲取不重復的編碼&#xff1a;從原始實現到高效優化本文針對軟件開發中“為新對象分配唯一編碼”的常見需求&#xff0c;以C#通信設備管理場景為例&#xff0c;從原始代碼分析入手&#xff0c;逐步講解基于LINQ和哈希集合的優化方案&#xff0c;幫助開發者理解不同場景下的最佳…

騰訊云人臉庫技術架構深度解析

騰訊云人臉庫技術架構深度解析人臉庫是現代人臉識別系統的核心組件&#xff0c;負責海量人臉特征的高效存儲、檢索和管理。騰訊云在人臉庫設計上采用了多項創新技術&#xff0c;本文將深入探討其技術實現細節。一、人臉庫核心架構騰訊云人臉庫采用分層架構設計&#xff1a;應用…

Transformer圖解指南:Attention機制動畫演示

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生專屬優惠。 Self-Attention矩陣運算 位置編碼可視化 讀者收獲&#xff1a;理解大模型基石架構 Attenti…

工業網絡安全:保護制造系統和數據

近年來&#xff0c;制造業數字化轉型加速推進。自動化生產線、智能工廠和工業物聯網設備已深度融入日常運營。這些進步在提升效率的同時&#xff0c;也暴露出新的安全漏洞。因此&#xff0c;工業網絡安全已成為全球制造商的首要任務之一。與主要保護辦公系統和客戶數據庫的傳統…

【RAGFlow代碼詳解-9】文檔解析和 OCR

系統概述 文檔解析和 OCR 系統提供多格式文檔支持&#xff0c;并具有基于視覺的分析功能。它由幾個關鍵組件組成&#xff1a; DeepDoc 視覺系統 &#xff1a;用于布局分析、表格檢測和 OCR 的高級計算機視覺模型多格式解析器 &#xff1a;支持 PDF、DOCX、Excel、Markdown、HTM…

元宇宙與醫療健康:重構診療體驗與健康管理模式

1 元宇宙重塑醫療診療核心流程1.1 遠程診療&#xff1a;從 “平面溝通” 到 “沉浸式問診”元宇宙打破遠程診療的空間限制&#xff0c;將傳統 “視頻通話式問診” 升級為 “沉浸式多維度交互”。在基礎問診環節&#xff0c;醫生的數字分身可通過 AR 技術 “進入” 患者家中&…

C6.1:發射極偏置放大器

基極偏置放大器的Q點不穩定&#xff0c;但是學習后了解了放大器的基本運行邏輯&#xff0c;發射極偏置放大器則是適合大規模應用&#xff0c;VDB和TSEB都具有穩定的Q點。講發射極偏置&#xff0c;首先要講旁路電容&#xff0c;前文的耦合電容和旁路電容類似&#xff0c;都是直流…

lanczos算法中的基向量V的存儲流程

我的問題是&#xff1a;這里提到的&#xff0c;為什么會增加V的列向量&#xff1f;V是怎么儲存的呢&#xff1f; 這個問題觸及了Lanczos算法實現的核心細節。 &#x1f9e0; 為什么會增加V的列向量&#xff1f; 因為Lanczos算法是一個迭代過程&#xff0c;它從一個初始向量開始…

Linux操作系統——TCP服務端并發模型

TCP&#xff1a;建立連接&#xff0c;一對一要實現多任務并發&#xff0c;就引出了并發模型一、多進程與多線程1.在相同資源情況下&#xff0c;進程資源開銷大&#xff0c;但其安全性高2.線程相對于進程資源開銷小&#xff0c;且并發量比進程大①多進程并發基礎代碼#include &l…

Ubuntu 22.04 插入光驅后磁盤滿啟動故障clean, ...files, ...blocks

硬件環境 設備型號&#xff1a;機械革命 Yilong15Pro Series GM5HG0A操作系統&#xff1a;Ubuntu 22.04.5 LTS (Jammy Jellyfish)內核版本&#xff1a;6.8.0-65-generic 問題經過 初始癥狀 連接外置光驅后&#xff0c;系統出現異常&#xff1a; 風扇持續高速運轉&#xff0c;噪…

聲網RTC穩定連麥、超分清晰,出海直播技術不再難選

我們是面向中東、南亞新興市場的泛娛樂直播平臺&#xff0c;主打 1V1 互動、PK 團戰與語音房。首個版本落地時&#xff0c;前端開發最焦慮的不是業務邏輯&#xff0c;而是音視頻底層問題 —— 延遲高、卡頓多、合唱不同步致觀眾秒退&#xff0c;我們每周改底層&#xff0c;單 P…

設計模式:橋接模式(Bridge Pattern)

文章目錄一、橋接模式的定義二、為什么需要橋接模式&#xff1f;三、示例代碼一、橋接模式的定義 橋接模式是一種結構型設計模式&#xff0c;它的主要作用是將抽象部分與實現部分分離&#xff0c;使它們能夠獨立變化。換句話說&#xff0c;就是把“抽象”和“實現”放到兩個獨立…

AI-Agent 深度科普:從概念到架構、應用與未來趨勢

目錄 一、Agent 究竟是什么&#xff1f; 二、Agent 的核心組成模塊 三、Agent 架構類型與協作模式 單智能體&#xff08;Single-Agent&#xff09; 多智能體協作&#xff08;Multi-Agent&#xff09; 人機協作&#xff08;Human-in-the-loop&#xff09; 四、Agent 的能…

企業分支上云的常見誤區與糾正方案

數字化轉型的浪潮下&#xff0c;“上云”幾乎成為所有企業的必答題。然而&#xff0c;在實際落地中&#xff0c;很多企業發現&#xff1a;總部上云容易&#xff0c;分支上云卻困難重重。不是網絡體驗不穩定&#xff0c;就是合規風險頻出&#xff0c;要么就是成本失控。這其中很…

深入解析函數棧幀創建與銷毀

目錄 一、函數棧幀&#xff08;Stack Frame&#xff09;整理 1、核心概念 2、為什么需要函數棧幀&#xff1f; 3、函數棧幀的主要內容 二、理解函數棧幀能解決的核心問題 1、局部變量的生命周期與本質 2、函數調用的參數傳遞機制 3、函數返回值的傳遞 三、函數棧幀的創…

廣告牌安全監測系統綜合解決方案

一、方案背景 廣告牌作為城市戶外廣告的重要載體&#xff0c;廣泛分布于城市道路、商業區及交通樞紐等人流密集區域。由于長期暴露在自然環境中&#xff0c;廣告牌面臨著風荷載、雨雪侵蝕、溫度變化等多重因素的影響&#xff0c;其結構安全性和穩定性直接關系到公共安全。近年來…

MII的原理

一、介紹 MII 是 Media Independent Interface&#xff08;媒體獨立接口&#xff09; 的縮寫&#xff0c;是一種用于連接網絡物理層&#xff08;PHY&#xff09;芯片和數據鏈路層&#xff08;MAC&#xff09;芯片的標準硬件接口&#xff0c;核心作用是讓不同類型的物理層&…

【Excel】Excel的工作場景

一、Excel的發展歷史 1.1 版本迭代周期 自Excel 2019版本起&#xff0c;微軟將更新周期穩定在每3年一次&#xff0c;而3年的周期剛好平衡了創新與穩定&#xff1a;既能緊跟大數據時代下用戶對自動化、智能化處理的需求&#xff08;比如近年數據量激增帶來的批量處理需求&#x…