如何查看java進(jìn)程gc情況
在 Java 應(yīng)用性能調(diào)優(yōu)中,監(jiān)控垃圾回收(GC)情況是關(guān)鍵環(huán)節(jié)。
以下是查看 Java 進(jìn)程 GC 狀態(tài)的常用方法、工具及最佳實踐:
一、命令行工具實時監(jiān)控
1. jstat(JDK 自帶)
功能:實時顯示 JVM 內(nèi)存和 GC 統(tǒng)計信息。
語法:
jstat -gc <pid> [間隔時間(ms)] [次數(shù)]
常用參數(shù):
-gc
:顯示 GC 相關(guān)統(tǒng)計。-gcutil
:顯示 GC 利用率(百分比)。
示例:
jstat -gc 12345 1000 # 每 1000ms 輸出一次 GC 統(tǒng)計
輸出字段含義:
S0C:Survivor0 區(qū)容量(KB) S1C:Survivor1 區(qū)容量 S0U:Survivor0 區(qū)已使用 EC:Eden 區(qū)容量 EU:Eden 區(qū)已使用 OC:老年代容量 OU:老年代已使用 MC:元空間容量 MU:元空間已使用 YGC:年輕代 GC 次數(shù) YGCT:年輕代 GC 總耗時(秒) FGC:Full GC 次數(shù) FGCT:Full GC 總耗時 GCT:GC 總耗時
2. jstat 進(jìn)階用法
監(jiān)控 GC 頻率和內(nèi)存增長趨勢:
# 每 5 秒輸出一次 GC 利用率,持續(xù)監(jiān)控 jstat -gcutil 12345 5000
輸出示例:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 99.81 93.21 42.35 92.83 89.75 126 0.536 1 0.024 0.560
關(guān)鍵指標(biāo):
E
(Eden 區(qū)使用率)接近 100% 時觸發(fā) YGC。O
(老年代使用率)持續(xù)增長可能導(dǎo)致 FGC。YGC
和FGC
頻率過高(如每分鐘多次)需警惕性能問題。
二、GC 日志分析
1. 啟用 GC 日志
在 JVM 啟動參數(shù)中添加:
java -XX:+PrintGCDetails \ -XX:+PrintGCDateStamps \ -XX:+PrintHeapAtGC \ -Xloggc:/path/to/gc.log \ -jar your-app.jar
參數(shù)說明:
PrintGCDetails
:打印 GC 詳細(xì)信息。PrintGCDateStamps
:添加 GC 發(fā)生的時間戳。Xloggc
:指定日志文件路徑。
2. 手動觸發(fā) GC 并查看日志
jcmd <pid> GC.run # 手動觸發(fā) Full GC tail -f /path/to/gc.log # 實時查看日志
3. 日志分析工具
GCEasy:
上傳 GC 日志到 GCEasy,自動生成分析報告,包含:
- GC 頻率和耗時分布。
- 堆內(nèi)存使用趨勢。
- 推薦的 JVM 參數(shù)優(yōu)化建議。
GCViewer:
本地工具,可視化 GC 日志:
java -jar gcviewer-1.36.jar /path/to/gc.log
三、可視化工具監(jiān)控 GC
1. VisualVM(JDK 自帶)
啟動方式:
jvisualvm # JDK 8 及以前版本自帶
監(jiān)控步驟:
- 選擇目標(biāo) Java 進(jìn)程 → 點(diǎn)擊「Monitor」選項卡。
- 查看「Heap」和「Perm Gen」變化趨勢。
- 點(diǎn)擊「Perform GC」手動觸發(fā) GC。
2. Java Mission Control (JMC) + JFR
啟動 JFR 記錄:
jcmd <pid> JFR.start name=GCRecording settings=profile duration=5m filename=gc.jfr
分析 GC 事件:
- 使用 JMC 打開
.jfr
文件。 - 查看「Garbage Collections」視圖,分析 GC 類型、耗時和內(nèi)存變化。
四、生產(chǎn)環(huán)境低開銷監(jiān)控方案
1. Prometheus + Grafana
配置 JMX Exporter:
java -javaagent:/path/to/jmx_prometheus_javaagent.jar=9090:/path/to/config.yaml -jar your-app.jar
Grafana 儀表盤:
導(dǎo)入預(yù)定義的 JVM 監(jiān)控儀表盤(如 ID 14548
),查看:
- 堆內(nèi)存各區(qū)域使用情況。
- GC 頻率和耗時趨勢。
- 類加載 / 卸載數(shù)量。
2. Arthas(在線診斷工具)
查看 GC 統(tǒng)計:
dashboard # 實時查看 JVM 狀態(tài),包括 GC 信息
監(jiān)控特定類的 GC 情況:
monitor -c 5 java.lang.String # 每 5 秒統(tǒng)計 String 對象的 GC 情況
五、GC 問題排查思路
1. 高頻 Full GC 排查
檢查老年代增長趨勢:
jstat -gcoldcapacity <pid> 1000 # 監(jiān)控老年代容量變化
分析大對象分配:
使用 JFR 記錄「Object Allocation in New TLAB」事件,找出頻繁創(chuàng)建大對象的代碼。
2. 長時間 STW(Stop The World)
檢查 GC 類型:
通過 GC 日志確認(rèn)是否為 CMS 或 G1 的 Full GC 導(dǎo)致。
優(yōu)化建議:
- 增大堆內(nèi)存(
-Xmx
)。 - 調(diào)整垃圾收集器(如使用 G1 或 ZGC)。
3. 內(nèi)存泄漏預(yù)警
對比多次堆轉(zhuǎn)儲:
# 間隔 1 小時生成兩次堆轉(zhuǎn)儲 jmap -dump:format=b,file=heap1.hprof <pid> sleep 3600 jmap -dump:format=b,file=heap2.hprof <pid>
使用 MAT 對比兩個堆轉(zhuǎn)儲,找出持續(xù)增長的對象類型。
六、GC 性能指標(biāo)參考
指標(biāo) | 健康值參考 | 問題表現(xiàn) |
---|---|---|
YGC 頻率 | 幾分鐘到幾十分鐘一次 | 每秒多次 |
YGC 耗時 | 通常 < 100ms | 超過 500ms |
FGC 頻率 | 幾小時到幾天一次 | 每小時多次 |
FGC 耗時 | 通常 < 500ms | 超過 1s |
老年代使用率 | 穩(wěn)定在 30%-70% | 持續(xù)增長接近 100% |
GC 總耗時占比 | < 5% | 超過 10% |
七、JVM 參數(shù)優(yōu)化建議
根據(jù)應(yīng)用特點(diǎn)調(diào)整 GC 相關(guān)參數(shù):
堆內(nèi)存分配:
-Xms2g -Xmx2g # 堆內(nèi)存初始值和最大值一致,避免動態(tài)調(diào)整
新生代比例:
-XX:NewRatio=2 # 老年代:新生代 = 2:1
垃圾收集器選擇
# G1 適合大內(nèi)存(> 8GB)應(yīng)用 -XX:+UseG1GC -XX:MaxGCPauseMillis=200 # ZGC 適合極低延遲要求(< 10ms STW) -XX:+UseZGC
通過以上方法,可全面監(jiān)控 Java 進(jìn)程的 GC 狀態(tài),及時發(fā)現(xiàn)并解決內(nèi)存泄漏、GC 頻繁等性能問題。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
elasticsearch索引創(chuàng)建create?index集群matedata更新
這篇文章主要介紹了elasticsearch索引創(chuàng)建create?index及集群matedata更新,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04Java14發(fā)布了,再也不怕NullPointerException了
這篇文章主要介紹了Java14發(fā)布了,再也不怕NullPointerException了,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-03-03MyBatis-Plus數(shù)據(jù)庫配置與數(shù)據(jù)源整合方案
本文詳細(xì)介紹了在MyBatis-Plus中進(jìn)行數(shù)據(jù)庫配置與數(shù)據(jù)源整合的常見方法,包括單數(shù)據(jù)源和多數(shù)據(jù)源的配置步驟,以及如何使用SpringBoot的自動配置和手動配置來管理數(shù)據(jù)源,通過合理的配置,開發(fā)者可以簡化數(shù)據(jù)庫操作,實現(xiàn)高效的數(shù)據(jù)庫管理和復(fù)雜的應(yīng)用架構(gòu)2025-02-02詳解如何為SpringBoot Web應(yīng)用的日志方便追蹤
在Web應(yīng)用程序領(lǐng)域,有效的請求監(jiān)控和可追溯性對于維護(hù)系統(tǒng)完整性和診斷問題至關(guān)重要,SpringBoot是一種用于構(gòu)建Java應(yīng)用程序的流行框架,在本文中,我們探討了在SpringBoot中向日志添加唯一ID的重要性,需要的朋友可以參考下2023-11-11