在JVM執行時開啟GC日誌
我們經常會遇到JVM執行時出錯的情況。若能在啟動時加入一些啟動選項(startup option),便可以獲取與bug相關的重要線索,從而有希望根治它們。但在實際操作時,我們總是忘記新增-XX:+HeapDumpOnOutOfMemoryError
或 -XX:+PrintGCDetails
這樣必要的flag。
每當面對如此窘境,我們只能關閉JVM,修改啟動引數(startup parameter),然後默默祈禱,希望問題場景(problematic situation)能在重啟之後得以重現。這種方法偶爾奏效,在場景重現後你或許還能收集到足夠的證據,以便動手根治潛在的問題。
不難看出,前文所述的方法問題顯著——你必須執行一次額外的重啟才能加入那煩人的debug選項,而不能借助中斷(outage)實現。事實上,JDK bundle提供了一種可行的變通方案,如果將之收入麾下,偶爾還能從中獲益。
jinfo
在JDK bundle中隱藏著一個精悍的小工具——jinfo。作為一個命令列工具,jinfo用於收集正在執行的Java程式的配置資訊。jinfo吸引眼球的地方在於,它能通過-flag
選項動態修改指定的Java程式中的某些JVM flag的值。雖然這樣的flag數量有限,但它們偶爾能夠幫助到你。通過以下的命令你便能看到JVM中哪些flag可以被jinfo動態修改:
my-precious me$ java -XX:+PrintFlagsFinal -version|grep manageable intx CMSAbortablePrecleanWaitMillis = 100 {manageable} intx CMSWaitDuration = 2000 {manageable} bool HeapDumpAfterFullGC = false {manageable} bool HeapDumpBeforeFullGC = false {manageable} bool HeapDumpOnOutOfMemoryError = false {manageable} ... cut for brevity ... bool PrintGC = false {manageable} bool PrintGCDateStamps = false {manageable} bool PrintGCDetails = false {manageable} bool PrintGCTimeStamps = false {manageable}
通過選項-XX:+PrintFlagsFinal
可以列出所有的JVM flag,而其中的標註為manageable
的flag則是值得我們關注的部分。這些flag可通過JDK management interface(-XX:+PrintFlagsFinal)動態修改。雖然在JConsole中也能查到與其十分相似的MBean。但在我看來,以命令列的方式檢視它們更加的便捷。
如何使用jinfo
讓我們通過實戰來學習如何使用jinfo。在下面的例子中,我們將在一個正在執行的JVM中動態開啟GC日誌功能:
my-precious me$ jps 12278 HighAllocationRate 12279 Jps 12269 JConsole my-precious me$ jinfo -flag +PrintGCDetails 12278 my-precious me$ jinfo -flag +PrintGC 12278 my-precious me$
在jinfo中需要開啟-XX:+PrintGC
和 -XX:+PrintGCDetails
兩個選項才能開啟GC日誌,這與用命令列引數的方式實現有著細微的差別——如果你通過啟動指令碼(startup script)來設定引數,僅需-XX:+PrintGCDetails
即可,因為-XX:+PrintGC
會被自動開啟。
不過,從standard output的結果來看,PID為12278的程式的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] ...
同理,若想關閉GC日誌功能,只需要執行jinfo -flag -PrintGCDetails 12278
和 jinfo -flag -PrintGC 12278
命令即可。
在我看來,學會使用jinfo,只能讓你在故障排除的工作中少花一到兩天的時間。若打一開始就使用Plumbr這類效能監控工具,你可能從未有過這樣的煩惱。
相關文章
- JVM GC日誌解析JVMGC
- JVM的GC日誌JVMGC
- JVM GC 日誌詳解JVMGC
- JVM 輸出 GC 日誌導致 JVM 卡住,我 TM 人傻了JVMGC
- JVM小冊(1)------jstat和Parallel GC日誌JVMJSParallelGC
- 在Hibernate中開啟日誌
- JAVA GC日誌分析JavaGC
- jvm-All日誌啟動引數JVM
- eclipse設定檢視GC日誌和如何理解GC日誌EclipseGC
- 曹工雜談:手把手帶你讀懂 JVM 的 gc 日誌JVMGC
- 從零開始JVM(一):初探JVM執行時資料區域JVM
- JVM執行時資料區JVM
- mysql開啟慢日誌MySql
- 做自動化測試時開啟多執行緒,怎麼解決日誌混亂的問題??執行緒
- JVM執行時資料區域JVM
- 檢視JVM執行時引數JVM
- JVM執行時資料區概述JVM
- JVM執行時區域詳解。JVM
- 通過JVM日誌來進行安全點分析JVM
- 寫了個開源小中介軟體——執行時動態日誌等級開關
- Ubuntu 下開啟 crontab日誌Ubuntu
- mysql開啟日誌記錄MySql
- RAC 開啟歸檔日誌
- postgresql開啟歸檔日誌SQL
- MySQL更新資料時,日誌(redo log、binlog)執行流程MySql
- php-fpm慢執行日誌PHP
- JVM——04執行時資料區(2)JVM
- JVM 執行時資料區詳解JVM
- Java-JVM-執行時資料區JavaJVM
- 對一次 GC日誌的分析GC
- 慢查詢日誌開啟分析
- PostgreSQL-開啟PG日誌(六)SQL
- win10怎麼看執行日誌 win10檢視執行日誌操作方法Win10
- 【金三銀四-JVM系列】CMS收集器與GC日誌分析定位問題詳解JVMGC
- JVM系列之GCJVMGC
- JVM — 執行時棧幀結構簡介JVM
- JVM學習-執行時資料區域JVM
- JVM -- 執行時棧幀結構簡介JVM