在运行时打开GC日志记录
總是有下一個(gè)JVM表現(xiàn)不佳。 而且,您內(nèi)心深知,如果您只有少數(shù)啟動(dòng)選項(xiàng)可以公開一些有關(guān)正在發(fā)生的事情的信息,那么您可能就有機(jī)會(huì)真正修復(fù)該死的東西。 但是不,您需要的標(biāo)志( -XX:+ HeapDumpOnOutOfMemoryError或-XX:+ PrintGCDetails )始終丟失。
因此,您可以悲痛地聳聳肩,殺死受苦的JVM,更改啟動(dòng)參數(shù),并祈禱問題的情況在重啟后得以重現(xiàn)。 有時(shí)確實(shí)如此,現(xiàn)在您可能有足夠的證據(jù)來進(jìn)行下一步工作并開始解決根本原因。
所描述的方法的問題很明顯–您需要進(jìn)行一次額外的重新啟動(dòng),而不是單次中斷,才能選擇那些令人討厭的調(diào)試選項(xiàng)。 事實(shí)上,有一種解決方法,有時(shí)將其添加到您的武庫(kù)可能會(huì)是有益的。
資訊
JDK捆綁包中隱藏了一個(gè)不錯(cuò)的小實(shí)用程序。 jinfo是一個(gè)命令行實(shí)用程序,用于從正在運(yùn)行的Java進(jìn)程中收集配置信息。 但是,有趣的部分是,使用-flag選項(xiàng), jinfo實(shí)用程序可以為指定的Java進(jìn)程動(dòng)態(tài)調(diào)整某些Java VM標(biāo)志的值。 這樣的標(biāo)志的列表是有限的,但是在某些情況下仍然有用。 可以通過以下命令檢查JVM上此類標(biāo)志的完整列表:
my-precious me$ java -XX:+PrintFlagsFinal -version|grep manageableintx 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選項(xiàng),在外面的“ 管理 ”選項(xiàng)目前的興趣。 這些可以通過JDK管理界面( com.sun.management.HotSpotDiagnosticMXBean API )動(dòng)態(tài)寫入。 同樣的MBean也通過JConsole發(fā)布。 按照我的喜好,命令行版本要方便得多。
示例如何使用jinfo
作為如何使用jinfo的示例,讓我們動(dòng)態(tài)地在運(yùn)行的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$該實(shí)用程序通過打開-XX:+ PrintGC和-XX:+ PrintGCDetails選項(xiàng)來打開GC日志記錄。 與命令行參數(shù)的行為的細(xì)微差別在于,您必須通過jinfo同時(shí)指定PrintGCDetails和PrintGC選項(xiàng)。 如果您是通過啟動(dòng)腳本設(shè)置參數(shù)的,則只需-XX:+ PrintGCDetails即可 ,因?yàn)樗鼤?huì)自動(dòng)打開-XX:+ PrintGC 。
不過,檢查標(biāo)準(zhǔn)輸出后,12278 PID的GC日志開始順利滾動(dòng):
... [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] ...關(guān)閉日志記錄是類似的–您只需要調(diào)用jinfo -flag -PrintGCDetails 12278和jinfo -flag -PrintGC 12278命令即可刪除日志消息。
有了這些知識(shí),我只能希望它將為您節(jié)省一兩天的故障排除時(shí)間。 假設(shè)您不是性能監(jiān)控工具(例如Plumbr)的滿意用戶,在這種情況下,您一開始就不會(huì)遇到此類需求。
翻譯自: https://www.javacodegeeks.com/2015/03/turning-on-gc-logging-at-runtime.html
總結(jié)
以上是生活随笔為你收集整理的在运行时打开GC日志记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 饺子汤汁怎么调 怎么调饺子汤汁
- 下一篇: Hazelcast入门指南第6部分