使用jstat的JVM统计信息
過(guò)去,我已經(jīng)寫(xiě)過(guò)關(guān)于Oracle和/或OpenJDK Java開(kāi)發(fā)工具包(JDK)隨附的幾個(gè)命令行工具的信息,但是我從來(lái)沒(méi)有專(zhuān)門(mén)寫(xiě)過(guò)jstat工具 。 Oracle JDK 9文檔Early Access指出jstat用于“監(jiān)視Java虛擬機(jī)(JVM)統(tǒng)計(jì)信息”。 還有一個(gè)警告,“此命令是實(shí)驗(yàn)性的,不受支持。” 盡管我引用了JDK 9文檔,但是jstat以Java SE 8 , Java SE 7 , Java SE 6和J2SE 5中的某種形式( 一次稱(chēng)為jvmstat )成為Sun / Oracle JDK的一部分。 Java 1.4.1引入了HotSpot JVM的檢測(cè)(僅在設(shè)置了-XX:+UsePerfData時(shí)啟用),并且自Java 1.4.2開(kāi)始提供了“始終在線檢測(cè)”。
jstat提供的許多信息可以從可視工具(例如VisualVM ,JMX和平臺(tái)MBean),垃圾收集日志或通過(guò)JVM選項(xiàng)中收集。 但是,與每個(gè)替代方案相比, jstat具有優(yōu)勢(shì)。 它的優(yōu)點(diǎn)包括命令行工具所共有的優(yōu)點(diǎn),例如可以從腳本執(zhí)行并運(yùn)行而無(wú)需開(kāi)發(fā)人員或其他人員。 能夠?qū)stat應(yīng)用于已經(jīng)運(yùn)行的Java進(jìn)程以開(kāi)始監(jiān)視其JVM統(tǒng)計(jì)信息,而不是在啟動(dòng)JVM時(shí)指定對(duì)那些選項(xiàng)的監(jiān)視,這也很有用。
對(duì)于本文中的示例,我正在使用Oracle JDK 9 build 164 。 下一個(gè)屏幕快照顯示了該版本,還顯示了開(kāi)始使用jstat時(shí)要應(yīng)用的第一個(gè)標(biāo)志之一: -options標(biāo)志。
如屏幕快照所示,以及jstat文檔中所述 , jstat -options用于“顯示特定平臺(tái)安裝的選項(xiàng)列表”。 在此處顯示的示例中,以下選項(xiàng)可用:
- -class
- -compiler
- -gc
- -gccapacity
- -gccause
- -gcmetacapacity
- -gcnew
- -gcnewcapacity
- -gcold
- -gcoldcapacity
- -gcutil
- -printcompilation
在本文中,我將只討論這些可用選項(xiàng)的一小部分,但是jstat文檔提供了一個(gè)句子來(lái)描述每個(gè)jstat選項(xiàng),并且每個(gè)選項(xiàng)的命令行用法與所有其他選項(xiàng)非常相似。 實(shí)際上,一旦學(xué)習(xí)了有關(guān)jstat使用的一些小知識(shí),各種選項(xiàng)的執(zhí)行就變得容易了。 使用jstat的困難部分通常是解釋jstat提供的數(shù)據(jù)。
jstat -help選項(xiàng)將打印簡(jiǎn)單用法,如下一個(gè)屏幕快照所示。
從jstat用法消息中,我們了解到j(luò)stat命令行工具是通過(guò)首先運(yùn)行命令名稱(chēng)( jstat ),其后帶有連字符的選項(xiàng)名稱(chēng),然后是可選的-t和/或-h標(biāo)志,以及隨后的命令來(lái)執(zhí)行的vimid ,并包含一個(gè)可選的時(shí)間間隔和在提供的時(shí)間間隔上執(zhí)行命令的可選次數(shù)。 示例比描述性文字清晰,這篇文章和jstat文檔中給出了一些示例。
為了監(jiān)視“本地” JVM統(tǒng)計(jì)信息, vmid只是JVM進(jìn)程的進(jìn)程ID。 這與臀部jcmd (或stodgy jps )為Java進(jìn)程返回的PID相同。 下一個(gè)屏幕快照演示了使用jcmd的Java應(yīng)用程序,我在我的例子(監(jiān)測(cè)(在這種情況下,8728)來(lái)識(shí)別PID JEDIT在這種情況下)。
jstat文檔的“虛擬機(jī)標(biāo)識(shí)符”部分提供了有關(guān)vmid的更多詳細(xì)信息,因?yàn)楦鼜?fù)雜的vmid (用于JVM統(tǒng)計(jì)信息的遠(yuǎn)程監(jiān)視)可以包括協(xié)議,本地目標(biāo)計(jì)算機(jī)的vmid ,主機(jī)和端口。 盡管我在本文中所有示例都將使用jstat和一個(gè)簡(jiǎn)單的Java PID( vmid ),但是jstat文檔的確提供了使用更詳細(xì)的vmid進(jìn)行JVM統(tǒng)計(jì)信息遠(yuǎn)程監(jiān)視的示例。
對(duì)于本文其余的示例,我想要一個(gè)Java應(yīng)用程序,從JVM統(tǒng)計(jì)信息監(jiān)視的角度來(lái)看,它比JEdit有趣。 我決定在強(qiáng)烈推薦的Plumbr博客上使用Nikita Salnikov-Tarnovski的帖子“ Garbage Collection:提高吞吐量 ”中的“ PigInThePython ”示例應(yīng)用程序。 如果您有興趣查看PigInThePython的源代碼,請(qǐng)參閱該文章 。
對(duì)于使用jstat第一個(gè)示例,我使用其最常用的選項(xiàng)之一: -gcutil 。 除了演示-gcutil選項(xiàng)之外,我還將使用第一個(gè)示例來(lái)演示和解釋除gcutil之外通常適用于其他jstat選項(xiàng)的jstat輸出選項(xiàng)。
以下屏幕快照演示了如何使用jcmd來(lái)獲取PigInThePython應(yīng)用程序的PID(在本例中為5096)以及如何以最簡(jiǎn)單的形式運(yùn)行jstat -gcutil 。
jstat -gcutil以最簡(jiǎn)單的形式(沒(méi)有其他選項(xiàng))顯示沒(méi)有時(shí)間戳的單行輸出。 列標(biāo)題中描述jstat文檔節(jié)“-gcutil選項(xiàng)”,其也描述了-gcutil選項(xiàng)如,“垃圾收集統(tǒng)計(jì)摘要”。 例如,本文檔說(shuō)明,其中一些列指示不同空間分配的使用百分比,而其他列指示垃圾收集事件的數(shù)量和垃圾收集的總時(shí)間。
我們通常希望將jstat提供的統(tǒng)計(jì)信息與受監(jiān)視系統(tǒng)中其他事件發(fā)生的時(shí)間相關(guān)聯(lián),以識(shí)別這些事件與對(duì)JVM的影響之間的相關(guān)性。 jstat -t選項(xiàng)將在輸出的開(kāi)頭加上時(shí)間戳。 此時(shí)間戳是自受監(jiān)視的JVM啟動(dòng)以來(lái)的秒數(shù)。 盡管這對(duì)于人類(lèi)而言不像其他格式那樣方便閱讀,但確實(shí)可以將JVM統(tǒng)計(jì)信息與運(yùn)行JVM的時(shí)間范圍以及包含時(shí)間戳的垃圾收集日志相關(guān)聯(lián)。 下一個(gè)屏幕快照演示了-t的作用:
監(jiān)視JVM統(tǒng)計(jì)信息(例如由jstat -gcutil提交的統(tǒng)計(jì)信息)不止一次通常非常有用。 下一個(gè)屏幕快照演示了如何使用指定的間隔( 100ms指定的100毫秒間隔,以每100毫秒捕獲并顯示這些結(jié)果。
第一次顯示快照后,最后一個(gè)屏幕快照中的輸出永遠(yuǎn)不會(huì)重復(fù)帶有列首字母縮寫(xiě)的標(biāo)題。 如果希望在一定的行數(shù)之后重復(fù)該標(biāo)頭,以便更輕松地知道哪些數(shù)字屬于輸出中更遠(yuǎn)的列,則-h選項(xiàng)可用于指定列之后的結(jié)果數(shù)標(biāo)頭再次顯示。 在下一個(gè)屏幕快照中, -h20用于每20行查看一次標(biāo)題。
有時(shí)可能需要讓jstat如此頻繁地且僅在一定次數(shù)內(nèi)提供其數(shù)據(jù)。 間隔允許您指定結(jié)果之間的持續(xù)時(shí)間,間隔指定之后的任何整數(shù)都將限制顯示結(jié)果的總次數(shù)。 在接下來(lái)的屏幕快照,所述15處命令的末尾限制輸出至15點(diǎn)總的行。
jstat -gccause選項(xiàng)返回與-gcutil相同的信息,但還會(huì)添加有關(guān)導(dǎo)致受監(jiān)視垃圾收集的原因的信息。 以下屏幕快照對(duì)此進(jìn)行了演示。
在上面的屏幕快照中,我們看到“上次垃圾收集的原因”(LGCC)是“ G1大量分配”,而“當(dāng)前垃圾收集的原因”(GCC)是“無(wú)GC”(當(dāng)前沒(méi)有垃圾收集)進(jìn)行)。
下一個(gè)屏幕快照演示了如何使用jstat -class查看“類(lèi)加載器統(tǒng)計(jì)信息”,以了解已加載的類(lèi)數(shù)(“ Loaded”),已加載的千字節(jié)數(shù)(第一個(gè)“ Bytes”),已卸載的類(lèi)數(shù)(“ Unloaded”)以及數(shù)量卸載的字節(jié)數(shù)(第二個(gè)“字節(jié)”),以及“執(zhí)行類(lèi)加載和卸載操作所花費(fèi)的時(shí)間”(“時(shí)間”)。
命令jstat -printcompilation指示“ Java HotSpot VM編譯器方法統(tǒng)計(jì)信息”,并在下一個(gè)屏幕快照中演示。
-printcompilation選項(xiàng)顯示列“已編譯”(“最近編譯的方法執(zhí)行的編譯任務(wù)數(shù)”),“大小”(“最近編譯的方法的字節(jié)碼的字節(jié)數(shù)”),“類(lèi)型”(“最近編譯的方法的編譯類(lèi)型”和“方法”(最近編譯的方法的類(lèi)/方法的名稱(chēng),以與HotSpot VM選項(xiàng)-XX:+PrintCompilation一致的格式表示)。
使用jstat -compiler命令,我們可以查看“ Java HotSpot VM即時(shí)編譯器統(tǒng)計(jì)信息”,例如已執(zhí)行的編譯任務(wù)數(shù)(“ Compiled”),失敗的編譯任務(wù)數(shù)(“ Failed”),無(wú)效的編譯任務(wù)數(shù)(“無(wú)效”),編譯所花費(fèi)的時(shí)間(“時(shí)間”),上次失敗的編譯的類(lèi)型和類(lèi)/方法名稱(chēng)(“ FailedType”和“ FailedMethod”)。 下一個(gè)屏幕快照對(duì)此進(jìn)行了演示。
jstat還有其他幾個(gè)選項(xiàng),其中大多數(shù)是特定于受監(jiān)視的JVM中有關(guān)垃圾回收的不同角度的。
jstat文檔警告該工具是試驗(yàn)性的,在JDK的未來(lái)版本中可能會(huì)更改或刪除。 該文檔還警告不要編寫(xiě)腳本和工具來(lái)解析jstat的輸出,因?yàn)閷?lái)輸出的內(nèi)容或格式可能會(huì)更改。 但是,我可以看到有人可能會(huì)冒這個(gè)險(xiǎn)并編寫(xiě)解析代碼,因?yàn)榭梢詮哪_本輕松訪問(wèn)此命令行工具,并且所需的解析代碼不會(huì)很復(fù)雜。
這篇文章是jstat ,但是要了解更多有關(guān)該工具的知識(shí)。 與使用該工具相比,對(duì)該工具結(jié)果的解釋要復(fù)雜得多,并且jstat提供的數(shù)據(jù)分析可能比收集數(shù)字的工作更具挑戰(zhàn)性。 下面列出了一些其他資源,以提供有關(guān)使用jstat工具收集和分析Java虛擬機(jī)統(tǒng)計(jì)信息的更多信息。
其他jstat資源
- Java Platform 9,標(biāo)準(zhǔn)版工具參考指南 : jstat
- Java Platform 8,Standard Edition故障排除指南 : jstat實(shí)用程序
- Plumbr:jstat
- 使用jstat監(jiān)視Java垃圾收集
- 解釋jstat的Full GC事件數(shù)
- 解釋jstat(堆內(nèi)存)以懷疑Java內(nèi)存泄漏
- 解釋jstat結(jié)果
- jstat工具:-gc選項(xiàng)提供的新元空間統(tǒng)計(jì)信息
- 學(xué)習(xí)java jstat
- 'jstat -gcutil'–垃圾回收統(tǒng)計(jì)
- 'jstat'命令選項(xiàng)和參數(shù)
- 使用Jstat在Java中進(jìn)行GC監(jiān)視
- 在Java中監(jiān)視垃圾收集
- 使用jstat報(bào)告自定義JVM指標(biāo)集
翻譯自: https://www.javacodegeeks.com/2017/05/jvm-statistics-jstat.html
總結(jié)
以上是生活随笔為你收集整理的使用jstat的JVM统计信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓万智牌2014汉化破解(安卓万智牌)
- 下一篇: 从战中清理代码