在文章《理解Java垃圾收集》中,我們了解了不同GC算法的流程,GC的工作方式,年輕代和年老代膝舅,以及您應(yīng)該了解的新JDK 7中5種類型的GC的知識。這些類型的GC對性能都有影響窑多。
本文將討論和說明如何監(jiān)控Java GC.
什么是GC監(jiān)控仍稀??
GC監(jiān)控是指通過工具或指令了解JVM運(yùn)行GC的過程和相關(guān)信息。例如埂息,我們可以找出:
年輕代的對象晉升多少到老年代技潘,或STW發(fā)生了多長時(shí)間等信息
通過GC監(jiān)控,我們可以知道JVM是否有效地運(yùn)行了GC千康,是否需要GC調(diào)優(yōu)享幽,同時(shí)為GC調(diào)優(yōu)提供依據(jù)。
如何監(jiān)控GC拾弃?
監(jiān)視GC的方式不同值桩,但唯一的區(qū)別是如何顯示GC操作信息。GC由JVM完成豪椿,并且由于GC監(jiān)視工具會公開JVM提供的GC信息奔坟,所以無論您如何監(jiān)視GC,您都將獲得相同的結(jié)果搭盾。因此咳秉,您不需要學(xué)習(xí)所有方法來監(jiān)視GC,但是由于只需要很少的時(shí)間就可以學(xué)習(xí)每種GC監(jiān)視方法鸯隅,因此了解其中的幾種方法可以幫助您在不同的情況和環(huán)境下使用正確的方法澜建。
首先,取決于訪問接口滋迈,可以將GC監(jiān)視方法分為CUI和GUI霎奢。典型的CUI GC監(jiān)視方法涉及使用單獨(dú)的名為“?jstat?”的CUI應(yīng)用程序,或者在運(yùn)行JVM時(shí)選擇一個(gè)名為“?verbosegc?”?的JVM選項(xiàng)饼灿。
GUI GC監(jiān)視是通過使用單獨(dú)的GUI應(yīng)用程序完成的,三個(gè)最常用的應(yīng)用程序是“ jconsole”帝美,“ jvisualvm”和“ Visual GC”碍彭。
讓我們進(jìn)一步了解每種方法。
jstat
jstat是HotSpot JVM中的監(jiān)視工具。用于HotSpot JVM的其他監(jiān)視工具是jps和jstatd庇忌。有時(shí)舞箍,您需要使用所有三個(gè)工具來監(jiān)視Java應(yīng)用程序。
jstat不只顯示GC操作信息皆疹。它還提供了類加載器操作信息或即時(shí)編譯器操作信息疏橄。在jstat可以提供的所有信息中,本文將僅介紹其監(jiān)視?GC操作信息的功能略就。
jstat位于$ JDK_HOME / bin中捎迫,因此,如果java或javac可以在不從命令行設(shè)置單獨(dú)目錄的情況下運(yùn)行表牢,那么jstat也可以窄绒。
您可以嘗試在命令行中運(yùn)行以下命令。
$> jstat –gc? $<vmid$> 1000
S0C?????? S1C?????? S0U??? S1U????? EC???????? EU????????? OC???????? OU???????? PC???????? PU???????? YGC???? YGCT??? FGC????? FGCT???? GCT
3008.0?? 3072.0??? 0.0???? 1511.1?? 343360.0?? 46383.0???? 699072.0?? 283690.2?? 75392.0??? 41064.3??? 2540??? 18.454??? 4????? 1.133??? 19.588
3008.0?? 3072.0??? 0.0???? 1511.1?? 343360.0?? 47530.9???? 699072.0?? 283690.2?? 75392.0??? 41064.3??? 2540??? 18.454??? 4????? 1.133??? 19.588
3008.0?? 3072.0??? 0.0???? 1511.1?? 343360.0?? 47793.0???? 699072.0?? 283690.2?? 75392.0??? 41064.3??? 2540??? 18.454??? 4????? 1.133??? 19.588
$>
就像在示例中一樣崔兴,實(shí)型數(shù)據(jù)將與以下列一起輸出:
S0C S1C S0U S1U EC EU OC OU PC彰导。
顧名思義,vmid(虛擬機(jī)ID)是VM?的ID敲茄∥荒保可以使用vmid指定在本地計(jì)算機(jī)或遠(yuǎn)程計(jì)算機(jī)上運(yùn)行的Java應(yīng)用程序。在本地計(jì)算機(jī)上運(yùn)行的Java應(yīng)用程序的vmid稱為lvmid(本地vmid)堰燎,通常是PID掏父。要找出lvmid,可以使用ps命令或Windows任務(wù)管理器寫入PID值爽待,但是我們建議使用jps损同,因?yàn)镻ID和lvmid并不總是匹配。jps代表Java PS鸟款。jps顯示vmids和主要方法信息膏燃。就像ps顯示PID和進(jìn)程名稱一樣。
通過使用jps查找要監(jiān)視的Java應(yīng)用程序的vmid何什,然后將其用作jstat中的參數(shù)组哩。我們建議您使用ps -ef |?grep java命令以及jps。
GC性能數(shù)據(jù)需要不斷觀察处渣,因此在運(yùn)行jstat時(shí)伶贰,請嘗試定期輸出GC監(jiān)視信息。?
例如罐栈,運(yùn)行“?jstat –gc <vmid> 1000?”(或1s)將每1秒在控制臺上顯示一次GC監(jiān)視數(shù)據(jù)黍衙。“?jstat –gc <vmid> 1000 10?”將每1秒顯示一次GC監(jiān)視信息荠诬,共10次琅翻。
除了-gc以外位仁,還有許多其他選項(xiàng),其中列出了與GC相關(guān)的選項(xiàng)方椎。
選項(xiàng)名稱描述
gc 顯示每個(gè)堆區(qū)域的當(dāng)前大小及其當(dāng)前使用情況(Eden聂抢,Survivor,年老代等)棠众,執(zhí)行的GC總數(shù)以及GC操作的累積時(shí)間琳疏。
gccapactiy 顯示每個(gè)堆區(qū)域的最小大小(ms)和最大大姓⒛谩(mx)空盼,當(dāng)前大小以及每個(gè)區(qū)域執(zhí)行的GC數(shù)量。(不顯示GC操作的當(dāng)前使用情況和累積時(shí)間胸墙。)
gccause 顯示了“ -gcutil提供的信息” +上一個(gè)GC的原因以及當(dāng)前GC的原因我注。
gcnew 顯示年輕代的GC性能數(shù)據(jù)。
gcnewcapacity 顯示年輕代大小的統(tǒng)計(jì)信息迟隅。
gcold 顯示年老代的GC性能數(shù)據(jù)但骨。
gcoldcapacity?顯示年老代大小的統(tǒng)計(jì)信息。
gcpermcapacity?顯示永久代的統(tǒng)計(jì)信息智袭。
gcutil 以百分比顯示每個(gè)堆區(qū)域的使用情況奔缠。還顯示執(zhí)行的GC總數(shù)和GC操作的累積時(shí)間。
僅查看頻率吼野,您可能會最多依次使用-gcutil(或-gccause)校哎,-?gc和-gccapacity。
-gcutil用于檢查堆區(qū)域的使用情況瞳步,執(zhí)行的GC數(shù)量以及GC操作的總累積時(shí)間闷哆,
而-gccapacity等其他選項(xiàng)可用來檢查大小。
您可以使用-gc選項(xiàng)查看以下輸出:
S0C????? S1C??? …?? GCT
1248.0?? 896.0? …?? 1.246
1248.0?? 896.0? …?? 1.246
…??????? …????? …?? …
不同的jstat選項(xiàng)顯示不同類型的列单起,如下所示抱怔。當(dāng)您使用右側(cè)列出的“ jstat選項(xiàng)”時(shí),將顯示每列信息嘀倒。
常用描述分析
S0C 以KB為單位顯示Survivor0區(qū)域的當(dāng)前大小
S1C 以KB為單位顯示Survivor1區(qū)域的當(dāng)前大小
S0U 以KB為單位顯示Survivor0區(qū)域的當(dāng)前使用情況
S1U 以KB為單位顯示Survivor1區(qū)域的當(dāng)前使用情況
EC?以KB為單位的Eden區(qū)的當(dāng)前大小
EU?顯示Eden區(qū)的當(dāng)前使用情況屈留,以KB為單位
OC?顯示年老代的當(dāng)前大小,以KB為單位
OU 以KB顯示年老代的當(dāng)前使用情況
YGC? Youngl GC事件的次數(shù)
YGCT Young?GC的累計(jì)總時(shí)間
FGC? Full GC事件的次數(shù)
FGCT?Full GC的累計(jì)總時(shí)間
GCT GC操作的總累積時(shí)間
jstat的優(yōu)點(diǎn)是只要可以使用控制臺测蘑,它就可以始終監(jiān)視在本地/遠(yuǎn)程計(jì)算機(jī)上運(yùn)行的Java應(yīng)用程序的GC操作數(shù)據(jù)灌危。使用–gcutil時(shí),輸出結(jié)果如下碳胳。在進(jìn)行?GC調(diào)優(yōu)時(shí)勇蝙,請?zhí)貏e注意YGC,YGCT挨约,F(xiàn)GC浅蚪,F(xiàn)GCT和GCT這幾個(gè)指標(biāo)藕帜。
S0????? S1?????? E??????? O??????? P??????? YGC??? YGCT???? FGC??? FGCT???? GCT
0.00??? 66.44??? 54.12??? 10.58??? 86.63??? 217??? 0.928???? 2???? 0.067??? 0.995
0.00??? 66.44??? 54.12??? 10.58??? 86.63??? 217??? 0.928???? 2???? 0.067??? 0.995
0.00??? 66.44??? 54.12??? 10.58??? 86.63??? 217??? 0.928???? 2???? 0.067??? 0.995
這些項(xiàng)目很重要烫罩,因?yàn)樗鼈冿@示了運(yùn)行GC所花費(fèi)的時(shí)間惜傲。
在此示例中,YGC為217贝攒,YGCT為0.928盗誊。因此,在計(jì)算算術(shù)平均值之后隘弊,您可以看到每次YGC?大約需要4毫秒(0.004秒)哈踱。同樣,平均Full GC時(shí)間為33ms梨熙。但是算術(shù)平均值通常無助于分析實(shí)際的GC問題开镣。為了查看單次GC時(shí)間而不是算術(shù)平均時(shí)間,更好的方式是使用 -verbosegc咽扇。
-verbosegc
-verbosegc是運(yùn)行Java應(yīng)用程序時(shí)指定的JVM選項(xiàng)之一邪财。java程序啟動時(shí)指定-verbosegc,每次出現(xiàn)GC時(shí)都會顯示易于理解的輸出結(jié)果质欲,因此對于監(jiān)視GC信息非常有幫助树埠。可在日志中輸出堆狀態(tài)信息(使用情況嘶伟,最大大小怎憋,GC /時(shí)間的次數(shù)等),GC之前/之后的年輕代和年老代的大小九昧,以及GC耗時(shí)
以下是可以與-verbosegc一起使用的其他選項(xiàng)绊袋。
-XX:+ PrintGC詳細(xì)信息
-XX:+ PrintGCTimeStamps
-XX:+ PrintHeapAtGC?
-XX:+ PrintGCDateStamps
如果僅使用-verbosegc,則默認(rèn)情況下將應(yīng)用-XX:+ PrintGCDetails铸鹰。
–verbosgc的其他選項(xiàng)不是唯一的癌别,可以混合使用。
使用-verbosegc時(shí)掉奄,每當(dāng)出現(xiàn)Young GC時(shí)规个,您都可以按照以下格式查看結(jié)果。
[GC [<collector>: <starting occupancy1> -> <ending occupancy1>, <pause time1> secs] <starting occupancy3> -> <ending occupancy3>, <pause time3> secs]
這是發(fā)生Full GC后輸出結(jié)果的示例姓建。
[Full GC [Tenured: 3485K->4095K(4096K), 0.1745373 secs] 61244K->7418K(63104K), [Perm : 10756K->10756K(12288K)], 0.1762129 secs] [Times: user=0.19 sys=0.00, real=0.19 secs]
如果使用CMS收集器诞仓,則還可以提供CMS信息。
由于-verbosegc選項(xiàng)每次發(fā)生GC事件時(shí)都會輸出一條日志速兔,因此很容易看到由GC操作引起的堆使用率的變化墅拭。
(Java)VisualVM?
Java Visual VM是Oracle JDK提供的GUI分析/監(jiān)視工具。
圖1:VisualVM屏幕截圖涣狗。
可以從Visual Studio的網(wǎng)站直接下載Visual VM谍婉,而不是JDK附帶的版本舒憾。為了方便起見,JDK附帶的版本將稱為Java VisualVM(jvisualvm)穗熬,而網(wǎng)站上提供的版本將稱為Visual VM(visualvm)镀迂。兩者的功能并不完全相同,因?yàn)樗鼈冎g存在細(xì)微差別唤蔗,例如在安裝插件時(shí)探遵。就個(gè)人而言,我更喜歡Visual VM版本妓柜,可以從網(wǎng)站上下載箱季。
運(yùn)行Visual VM后,如果從左側(cè)窗口中選擇要監(jiān)視的應(yīng)用程序棍掐,則可以在其中找到“?監(jiān)視?”選項(xiàng)卡藏雏。您可以從此“監(jiān)視”選項(xiàng)卡獲取有關(guān)GC和堆的基本信息。?
如果需要jstat提供的詳細(xì)信息作煌,則建議安裝Visual GC插件掘殴。?
圖2:Viusal GC安裝屏幕截圖。
通過使用Visual GC最疆,您可以查看以更直觀的方式運(yùn)行jstatd所提供的信息杯巨。 ?
圖3:Visual GC執(zhí)行屏幕截圖。
HPJMeter可方便地分析-verbosegc輸出結(jié)果努酸。如果可以將Visual GC視為jstat的GUI等效項(xiàng)服爷,則HPJMeter將成為-verbosgc的GUI等效項(xiàng)。當(dāng)然获诈,GC分析只是HPJMeter提供的眾多功能之一仍源。HPJMeter是HP開發(fā)的性能監(jiān)視工具。它可以在HP-UX以及Linux和MS Windows中使用舔涎。
執(zhí)行應(yīng)用程序時(shí)笼踩,-verbosegc輸出結(jié)果將重定向到單獨(dú)的文件。
您可以使用HPJMeter打開重定向的文件亡嫌,這可以通過直觀的GUI更快嚎于,更輕松地分析GC性能數(shù)據(jù)。
圖4:HPJMeter挟冠。