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

