資源描述:
《成為javagc專(zhuān)家partii—如何監(jiān)控java垃圾回收機(jī)制-java開(kāi)發(fā)java經(jīng)驗(yàn)技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、成為JavaGC專(zhuān)家PartII—如何監(jiān)控Java垃圾回收機(jī)制-Java開(kāi)發(fā)Java經(jīng)驗(yàn)技巧成為JavaGC專(zhuān)家(2)—如何監(jiān)控Java垃圾回收機(jī)制本文作者:ImportNcw-王曉杰未經(jīng)許可,禁止轉(zhuǎn)載!本文是成為JavaGC專(zhuān)家系列文章的第二篇。在第一篇《深入淺出Java垃圾回收機(jī)制》中我們學(xué)習(xí)了不同GC算法的執(zhí)行過(guò)程,GC是如何工作的,什么是新生代和老年代,你應(yīng)該了解的JDK7中的5種GC類(lèi)型,以及這5種類(lèi)型對(duì)于應(yīng)用性能的影響。在本文小,我將解釋JVM到底是如何執(zhí)行垃圾回收處理的。什么是GC監(jiān)控?垃圾回收收
2、集監(jiān)控指的是搞清楚JVM如何執(zhí)行GC的過(guò)程,例如,我們可以查明:1.???????何時(shí)一個(gè)新生代中的對(duì)象被移動(dòng)到老年代時(shí),所花費(fèi)的時(shí)間。2.?????Stop-the-world何時(shí)發(fā)生的,持續(xù)了多長(zhǎng)時(shí)間。GC監(jiān)控是為了鑒別JVM是否在高效地執(zhí)行GC,以及是否有必要進(jìn)行額外的性能調(diào)優(yōu)?;谝陨闲畔ⅲ覀兛梢孕薷膽?yīng)用程序或者調(diào)整GC算法(GC優(yōu)化)。如何監(jiān)控GC有很多種方法可以監(jiān)控GC,但其差別僅僅是GC操作通過(guò)何種方式展現(xiàn)而已。GC操作是由JVM來(lái)完成,而GC監(jiān)控工具只是將JVM提供的GC信息展現(xiàn)給你,因此,不
3、論你使用何種方式監(jiān)控GC都將得到相同的結(jié)果。所以你也就不必去學(xué)習(xí)所有的監(jiān)控GC的方法。但是因?yàn)閷W(xué)習(xí)每種監(jiān)控方法不會(huì)占用太多時(shí)間,了解多一點(diǎn)可以幫助你根據(jù)不同的場(chǎng)景選擇最為合適的方式。下面所列的工具以及JVM參數(shù)并不適用于所有的HVM供應(yīng)商。這是因?yàn)椴](méi)有關(guān)于GC信息的強(qiáng)制標(biāo)準(zhǔn)。本文我們將使用HotSpotJVM(OracleJVM)。因?yàn)镹HN一直在使用Oracle(Sun)JVM,所以用它作為示例來(lái)解釋我們提到的工具和JVM參數(shù)更容易些。首先,GC監(jiān)控方法根據(jù)訪問(wèn)的接口不同,可以分成CUI和GUI兩大類(lèi)。CU
4、IGC監(jiān)控方法使用一個(gè)獨(dú)立的叫做”jstat”的CUI應(yīng)用,或者在啟動(dòng)JVM的時(shí)■候選擇JVM參數(shù)”verbosegc”。GUIGC監(jiān)控由一個(gè)單獨(dú)的圖形化應(yīng)用來(lái)完成,其中三個(gè)最常用的應(yīng)用是”jconsole”,“jvisualvm”和“VisualGC”。下面我們來(lái)詳細(xì)學(xué)習(xí)每種方法。jstatjstat是HotSpotJVM提供的一個(gè)監(jiān)控工具。其他監(jiān)控工具還有jps和jstatdo有些時(shí)候,你可能需耍同時(shí)使用三種工具來(lái)監(jiān)控你的應(yīng)用。jstat不僅提供GC操作的信息,還提供類(lèi)裝載操作的信息以及運(yùn)行時(shí)編譯器操作的信
5、息。本文將只涉及jstat能夠提供的信息小與監(jiān)控GC操作信息相關(guān)的功能。jstat被放置在$JDK_H0ME/bino因此只要java和javac能執(zhí)行,jstat同樣可以執(zhí)行。你可以在命令行環(huán)境下執(zhí)行如下語(yǔ)句。S0CS1CSOUSIU0UPCPUGCT3008.03072.00.01511.1283690.275392.041064.319.5883008.03072.00.01511.1283690.275392.041064.319.5883008.03072.00.01511.1283690.27539
6、2.041064.319.588$>jstat-go$1000ECYGCYGCTEUFGCOCFGCT343360.046383.0699072.025401&45441.133343360.047530.9699072.025401&45441.133343360.047793.0699072.025401&45441.133$>在上圖的例子小,實(shí)際的數(shù)據(jù)會(huì)按照如下列輸出:SOCSICSOUSIUECEU0COUPCvmid(虛擬機(jī)ID),正如其名字描述的,它是虛擬機(jī)的ID,Java應(yīng)用不論運(yùn)行
7、在木地還是遠(yuǎn)程的機(jī)器都會(huì)擁有自己獨(dú)立的vmido運(yùn)行在本地機(jī)器上的vmid稱(chēng)之為Ivmid(本地vmid),通常是PTDo如果想得到PID的值你可以使用ps命令或者windows任務(wù)管理器,但我們推薦使用jps來(lái)獲取,因?yàn)镻ID和Ivmid有時(shí)會(huì)不一致。jps通過(guò)JavaPS實(shí)現(xiàn),jps命令會(huì)返回vmids和main方法的信息,正如ps命令展現(xiàn)PIDS和進(jìn)程名字那樣。首先通過(guò)jps命令找到你要監(jiān)控的Java應(yīng)用的vmid,并把它作為jstat的參數(shù)。當(dāng)幾個(gè)WAS實(shí)例運(yùn)行在同一臺(tái)設(shè)備上時(shí),如果你只使用jps命令,
8、將只能看到啟動(dòng)(bootstrap)信息。我們建議在這種情況下使用ps-ef
9、grepjava與jps配合使用。想要得到GC性能相關(guān)的數(shù)據(jù)需要持續(xù)不斷地監(jiān)控,因此在執(zhí)行jstat時(shí),要規(guī)則地輸出GC監(jiān)控的信息。例如,執(zhí)行"jstat-gc1000(或Is)會(huì)每隔一秒展示GC監(jiān)控?cái)?shù)據(jù)?!眏stat-gc100010"會(huì)每隔1秒展現(xiàn)一次,口一共10次。參數(shù)名稱(chēng)gc描述輸岀每個(gè)堆區(qū)域的當(dāng)前可