首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JVM 運行時動態開啟 GC 日誌:jinfo 實戰指南

     編輯:Java 相關知識

痛點:重啟才能加參數?

生產環境 JVM 突發 OOM 或 GC 停頓,往往因啟動腳本缺少 -XX:+PrintGCDetails 等診斷參數。傳統做法是停機、改腳本、重啟、祈禱問題復現——這不僅造成服務中斷,問題還可能因環境變化而無法復現。

幸運的是,JDK 自帶的 jinfo 工具支援運行時動態修改可管理旗標,讓我們在不重啟的情況下即時開啟 GC 日誌,快速定位問題。

核心工具:jinfo

jinfo 是 JDK 隨附的命令列診斷工具,可查看並修改執行中 Java 進程的 JVM 旗標。關鍵在於:只有標註為 manageable 的旗標才能動態調整。

查看可動態修改的旗標

java -XX:+PrintFlagsFinal -version | grep manageable

輸出範例(節錄):

bool HeapDumpOnOutOfMemoryError = false {manageable}
bool PrintGC = false {manageable}
bool PrintGCDateStamps = false {manageable}
bool PrintGCDetails = false {manageable}
bool PrintGCTimeStamps = false {manageable}

標註 {manageable} 的即為可透過 jinfo -flag 動態切換的選項。

實戰:動態開啟 GC 日誌

步驟 1:確認目標進程 PID

jps
# 輸出範例:
# 12278 HighAllocationRate
# 12279 Jps
# 12269 JConsole

假設目標應用 PID 為 12278。

步驟 2:啟用 GC 詳細日誌(需同時開啟兩個旗標)

jinfo -flag +PrintGCDetails 12278
jinfo -flag +PrintGC 12278

注意:與啟動參數不同,運行時必須同時開啟 PrintGC 與 PrintGCDetails;啟動時僅需 PrintGCDetails 會自動隱含開啟 PrintGC。

步驟 3:觀察標準輸出

控制台將即時滾動輸出類似下列 GC 日誌:

[GC (Allocation Failure) [PSYoungGen: 876416K->102624K(909312K)] 1094420K->320820K(1161216K), 0.2173131 secs]
[Times: user=0.74 sys=0.00, real=0.22 secs]
[GC (Allocation Failure) [PSYoungGen: 890304K->102240K(917504K)] 1108924K->320956K(1169408K), 0.2446639 secs]
[Times: user=0.82 sys=0.01, real=0.25 secs]

步驟 4:關閉日誌(問題定位後)

jinfo -flag -PrintGCDetails 12278
jinfo -flag -PrintGC 12278

進階:其他可動態調整的關鍵旗標

旗標用途
HeapDumpOnOutOfMemoryErrorOOM 時自動產生 Heap Dump
PrintGCDateStampsGC 日誌加入日期時間戳
PrintGCTimeStampsGC 日誌加入相對時間戳
CMSAbortablePrecleanWaitMillisCMS 預清理等待閾值調優

避坑指南與最佳實踐

  • 權限一致性:執行 jinfo 的用戶必須與目標 JVM 進程擁有者相同(或具備足夠權限)。
  • 旗標不支援動態修改:如 -Xmx、-Xms、-XX:NewRatio 等非 manageable 旗標無法運行時調整,仍需重啟。
  • 日誌輸出位置:動態開啟的 GC 日誌輸出至 JVM 的 標準輸出 (stdout),若應用將 stdout 重導向檔案,日誌將寫入該檔案;若未重導向,需在啟動腳本中配置 -Xloggc:/path/gc.log 以持久化。
  • 生產環境謹慎使用:高頻 GC 日誌會增加 I/O 壓力,建議定位完問題後及時關閉。

總結

掌握 jinfo 動態調整 manageable 旗標的技巧,能讓你在故障現場「不停機、不重啟、即時可見」地獲取關鍵診斷數據,大幅縮短 MTTR(平均修復時間)。配合 jstack、jmap、jstat 等工具,構建完整的 JVM 故障診斷工具箱。

專家建議:若系統長期面臨效能調優壓力,引入 APM(如 Pinpoint、SkyWalking)或持續分析工具(如 Plumbr、Java Flight Recorder)可實現更主動、全維度的監控,減少臨時排查成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved