如何監(jiān)視Java垃圾回收

在文章《理解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)視方法分為CUIGUI霎奢。典型的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)視工具是jpsjstatd庇忌。有時(shí)舞箍,您需要使用所有三個(gè)工具來監(jiān)視Java應(yīng)用程序。

jstat不只顯示GC操作信息皆疹。它還提供了類加載器操作信息或即時(shí)編譯器操作信息疏橄。在jstat可以提供的所有信息中,本文將僅介紹其監(jiān)視?GC操作信息的功能略就。

jstat位于$ JDK_HOME / bin中捎迫,因此,如果javajavac可以在不從命令行設(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

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挟冠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末于购,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子知染,更是在濱河造成了極大的恐慌肋僧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嫌吠,居然都是意外死亡止潘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門辫诅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凭戴,“玉大人,你說我怎么就攤上這事泥栖〈乜恚” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵吧享,是天一觀的道長。 經(jīng)常有香客問我譬嚣,道長钢颂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任拜银,我火速辦了婚禮殊鞭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尼桶。我一直安慰自己操灿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布泵督。 她就那樣靜靜地躺著趾盐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪小腊。 梳的紋絲不亂的頭發(fā)上救鲤,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音秩冈,去河邊找鬼本缠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛入问,可吹牛的內(nèi)容都是我干的丹锹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼芬失,長吁一口氣:“原來是場噩夢啊……” “哼楣黍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起麸折,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤锡凝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后垢啼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窜锯,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡张肾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锚扎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吞瞪。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驾孔,靈堂內(nèi)的尸體忽然破棺而出芍秆,到底是詐尸還是另有隱情,我是刑警寧澤翠勉,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布妖啥,位于F島的核電站,受9級特大地震影響对碌,放射性物質(zhì)發(fā)生泄漏荆虱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一朽们、第九天 我趴在偏房一處隱蔽的房頂上張望怀读。 院中可真熱鬧,春花似錦骑脱、人聲如沸菜枷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啤誊。三九已至,卻和暖如春歹袁,著一層夾襖步出監(jiān)牢的瞬間坷衍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工条舔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留枫耳,地道東北人孟抗。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓迁杨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凄硼。 傳聞我的和親對象是個(gè)殘疾皇子铅协,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容