?16年的時(shí)候花了一些時(shí)間整理了一些關(guān)于jvm的介紹文章,到現(xiàn)在回顧起來(lái)還是一些還沒有補(bǔ)充全面,其中就包括如何利用工具來(lái)監(jiān)控調(diào)優(yōu)前后的性能變化。工具做為圖形化界面來(lái)展示更能直觀的發(fā)現(xiàn)問(wèn)題,另一方面一些耗費(fèi)性能的分析(dump文件分析)一般也不會(huì)在生產(chǎn)直接分析,往往dump下來(lái)的文件達(dá)1G左右聘萨,人工分析效率較低,因此利用工具來(lái)分析jvm相關(guān)問(wèn)題朦促,長(zhǎng)長(zhǎng)可以到達(dá)事半功倍的效果來(lái)膝晾。
jvm監(jiān)控分析工具一般分為兩類,一種是jdk自帶的工具务冕,一種是第三方的分析工具血当。jdk自帶工具一般在jdk bin目錄下面,以exe的形式直接點(diǎn)擊就可以使用禀忆,其中包含分析工具已經(jīng)很強(qiáng)大臊旭,幾乎涉及了方方面面,但是我們最常使用的只有兩款:jconsole.exe和jvisualvm.exe箩退;第三方的分析工具有很多离熏,各自的側(cè)重點(diǎn)不同,比較有代表性的:MAT(Memory Analyzer Tool)戴涝、GChisto等滋戳。
對(duì)于大型 JAVA 應(yīng)用程序來(lái)說(shuō),再精細(xì)的測(cè)試也難以堵住所有的漏洞啥刻,即便我們?cè)跍y(cè)試階段進(jìn)行了大量卓有成效的工作胧瓜,很多問(wèn)題還是會(huì)在生產(chǎn)環(huán)境下暴露出來(lái),并且很難在測(cè)試環(huán)境中進(jìn)行重現(xiàn)郑什。JVM 能夠記錄下問(wèn)題發(fā)生時(shí)系統(tǒng)的部分運(yùn)行狀態(tài)府喳,并將其存儲(chǔ)在堆轉(zhuǎn)儲(chǔ) (Heap Dump) 文件中,從而為我們分析和診斷問(wèn)題提供了重要的依據(jù)蘑拯。其中VisualVM和MAT是dump文件的分析利器钝满。
jdk自帶的工具
jconsole
Jconsole(Java Monitoring and Management Console)是從java5開始,在JDK中自帶的java監(jiān)控和管理控制臺(tái)申窘,用于對(duì)JVM中內(nèi)存弯蚜,線程和類等的監(jiān)控,是一個(gè)基于JMX(java management extensions)的GUI性能監(jiān)測(cè)工具剃法。jconsole使用jvm的擴(kuò)展機(jī)制獲取并展示虛擬機(jī)中運(yùn)行的應(yīng)用程序的性能和資源消耗等信息碎捺。
直接在jdk/bin目錄下點(diǎn)擊jconsole.exe即可啟動(dòng),界面如下:
在彈出的框中可以選擇本機(jī)的監(jiān)控本機(jī)的java應(yīng)用贷洲,也可以選擇遠(yuǎn)程的java服務(wù)來(lái)監(jiān)控收厨,如果監(jiān)控遠(yuǎn)程服務(wù)需要在tomcat啟動(dòng)腳本中添加如下代碼:
?-Dcom.sun.management.jmxremote.port=6969 ?
?-Dcom.sun.management.jmxremote.ssl=false ?
?-Dcom.sun.management.jmxremote.authenticate=false
連接進(jìn)去之后,就可以看到j(luò)console概覽圖和主要的功能:概述优构、內(nèi)存诵叁、線程、類钦椭、VM拧额、MBeans
概述碑诉,以圖表的方式顯示出堆內(nèi)存使用量,活動(dòng)線程數(shù)侥锦,已加載的類进栽,CUP占用率的折線圖,可以非常清晰的觀察在程序執(zhí)行過(guò)程中的變動(dòng)情況恭垦。
內(nèi)存快毛,主要展示了內(nèi)存的使用情況,同時(shí)可以查看堆和非堆內(nèi)存的變化值對(duì)比署照,也可以點(diǎn)擊執(zhí)行GC來(lái)處罰GC的執(zhí)行
線程,主界面展示線程數(shù)的活動(dòng)數(shù)和峰值吗浩,同時(shí)點(diǎn)擊左下方線程可以查看線程的詳細(xì)信息建芙,比如線程的狀態(tài)是什么,堆棧內(nèi)容等懂扼,同時(shí)也可以點(diǎn)擊“檢測(cè)死鎖”來(lái)檢查線程之間是否有死鎖的情況禁荸。
類,主要展示已加載類的相關(guān)信息阀湿。
VM 概要赶熟,展示JVM所有信息總覽,包括基本信息陷嘴、線程相關(guān)映砖、堆相關(guān)、操作系統(tǒng)灾挨、VM參數(shù)等邑退。
Mbean,查看Mbean的屬性,方法等劳澄。
VisualVM
簡(jiǎn)介
VisualVM 是一個(gè)工具地技,它提供了一個(gè)可視界面,用于查看 Java 虛擬機(jī) (Java Virtual Machine, JVM) 上運(yùn)行的基于 Java 技術(shù)的應(yīng)用程序(Java 應(yīng)用程序)的詳細(xì)信息秒拔。VisualVM 對(duì) Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關(guān)數(shù)據(jù)進(jìn)行組織莫矗,并通過(guò)一種使您可以快速查看有關(guān)多個(gè) Java 應(yīng)用程序的數(shù)據(jù)的方式提供該信息。您可以查看本地應(yīng)用程序以及遠(yuǎn)程主機(jī)上運(yùn)行的應(yīng)用程序的相關(guān)數(shù)據(jù)砂缩。此外作谚,還可以捕獲有關(guān) JVM 軟件實(shí)例的數(shù)據(jù),并將該數(shù)據(jù)保存到本地系統(tǒng)庵芭,以供后期查看或與其他用戶共享食磕。
VisualVM 是javajdk自帶的最牛逼的調(diào)優(yōu)工具了吧,也是我平時(shí)使用最多調(diào)優(yōu)工具喳挑,幾乎涉及了jvm調(diào)優(yōu)的方方面面彬伦。同樣是在jdk/bin目錄下面雙擊jvisualvm.exe既可使用滔悉,啟動(dòng)起來(lái)后和jconsole 一樣同樣可以選擇本地和遠(yuǎn)程,如果需要監(jiān)控遠(yuǎn)程同樣需要配置相關(guān)參數(shù)单绑,主界面如下回官;
VisualVM可以根據(jù)需要安裝不同的插件,每個(gè)插件的關(guān)注點(diǎn)都不同搂橙,有的主要監(jiān)控GC歉提,有的主要監(jiān)控內(nèi)存,有的監(jiān)控線程等区转。
如何安裝:
1苔巨、從主菜單中選擇“工具”>“插件”。
2废离、在“可用插件”標(biāo)簽中侄泽,選中該插件的“安裝”復(fù)選框。單擊“安裝”蜻韭。
3悼尾、逐步完成插件安裝程序。
我這里以 Eclipse(pid 22296)為例肖方,雙擊后直接展開闺魏,主界面展示了系統(tǒng)和jvm兩大塊內(nèi)容,點(diǎn)擊右下方j(luò)vm參數(shù)和系統(tǒng)屬性可以參考詳細(xì)的參數(shù)信息.
因?yàn)閂isualVM的插件太多俯画,我這里主要介紹三個(gè)我主要使用幾個(gè):監(jiān)控析桥、線程、Visual GC
監(jiān)控的主頁(yè)其實(shí)也就是艰垂,cpu烹骨、內(nèi)存、類材泄、線程的圖表
線程和jconsole功能沒有太大的區(qū)別
Visual GC 是常常使用的一個(gè)功能沮焕,可以明顯的看到年輕代、老年代的內(nèi)存變化拉宗,以及gc頻率峦树、gc的時(shí)間等。
以上的功能其實(shí)jconsole幾乎也有旦事,VisualVM更全面更直觀一些魁巩,另外VisualVM非常多的其它功能,可以分析dump的內(nèi)存快照姐浮,dump出來(lái)的線程快照并且進(jìn)行分析等谷遂,還有其它很多的插件大家可以去探索
第三方調(diào)優(yōu)工具
MAT
MAT是什么?
MAT(Memory Analyzer Tool)卖鲤,一個(gè)基于Eclipse的內(nèi)存分析工具肾扰,是一個(gè)快速畴嘶、功能豐富的Java heap分析工具,它可以幫助我們查找內(nèi)存泄漏和減少內(nèi)存消耗集晚。使用內(nèi)存分析工具從眾多的對(duì)象中進(jìn)行分析窗悯,快速的計(jì)算出在內(nèi)存中對(duì)象的占用大小,看看是誰(shuí)阻止了垃圾收集器的回收工作偷拔,并可以通過(guò)報(bào)表直觀的查看到可能造成這種結(jié)果的對(duì)象蒋院。
通常內(nèi)存泄露分析被認(rèn)為是一件很有難度的工作,一般由團(tuán)隊(duì)中的資深人士進(jìn)行莲绰。不過(guò)要介紹的 MAT(Eclipse Memory Analyzer)被認(rèn)為是一個(gè)“傻瓜式“的堆轉(zhuǎn)儲(chǔ)文件分析工具欺旧,你只需要輕輕點(diǎn)擊一下鼠標(biāo)就可以生成一個(gè)專業(yè)的分析報(bào)告。和其他內(nèi)存泄露分析工具相比蛤签,MAT 的使用非常容易辞友,基本可以實(shí)現(xiàn)一鍵到位,即使是新手也能夠很快上手使用顷啼。
MAT以eclipse 插件的形式來(lái)安裝踏枣,具體的安裝過(guò)程就不在描述了昌屉,可以利用visualvm或者是 jmap命令生產(chǎn)堆文件钙蒙,導(dǎo)入eclipse mat中生成分析報(bào)告:
生產(chǎn)這會(huì)報(bào)表的同時(shí)也會(huì)在dump文件的同級(jí)目錄下生成三份(dump_Top_Consumers.zip、dump_Leak_Suspects.zip间驮、dump_Top_Components.zip)分析結(jié)果的html文件躬厌,方便發(fā)送給相關(guān)同事來(lái)查看。
需要關(guān)注的是下面的Actions竞帽、Reports扛施、Step by Step區(qū)域:
Histogram:列出內(nèi)存中的對(duì)象,對(duì)象的個(gè)數(shù)以及大小屹篓,支持正則表達(dá)式查找疙渣,也可以計(jì)算出該類所有對(duì)象的retained size
Dominator Tree:列出最大的對(duì)象以及其依賴存活的Object (大小是以Retained Heap為標(biāo)準(zhǔn)排序的)
Top Consumers :?通過(guò)圖形列出最大的object
duplicate classes :檢測(cè)由多個(gè)類裝載器加載的類
Leak Suspects :內(nèi)存泄漏分析
Top Components: 列出大于總堆數(shù)的百分之1的報(bào)表。
Component Report:分析對(duì)象屬于同一個(gè)包或者被同一個(gè)類加載器加載
以上只是一個(gè)初級(jí)的介紹堆巧,mat還有更強(qiáng)大的使用妄荔,比如對(duì)比堆內(nèi)存,在生產(chǎn)環(huán)境中往往為了定位問(wèn)題谍肤,每隔幾分鐘dump出一下內(nèi)存快照啦租,隨后在對(duì)比不同時(shí)間的堆內(nèi)存的變化來(lái)發(fā)現(xiàn)問(wèn)題。
GChisto
GChisto是一款專業(yè)分析gc日志的工具荒揣,可以通過(guò)gc日志來(lái)分析:Minor GC篷角、full gc的時(shí)間、頻率等等系任,通過(guò)列表恳蹲、報(bào)表虐块、圖表等不同的形式來(lái)反應(yīng)gc的情況。雖然界面略顯粗糙阱缓,但是功能還是不錯(cuò)的非凌。
配置好本地的jdk環(huán)境之后,雙擊GChisto.jar,在彈出的輸入框中點(diǎn)擊 add 選擇gc.log日志
GC Pause Stats:可以查看GC 的次數(shù)荆针、GC的時(shí)間敞嗡、GC的開銷、最大GC時(shí)間和最小GC時(shí)間等航背,以及相應(yīng)的柱狀圖
GC Pause Distribution:查看GC停頓的詳細(xì)分布喉悴,x軸表示垃圾收集停頓時(shí)間,y軸表示是停頓次數(shù)玖媚。
GC Timeline:顯示整個(gè)時(shí)間線上的垃圾收集
不過(guò)這款工具已經(jīng)不再維護(hù)箕肃,不能識(shí)別最新jdk的日志文件。
gcviewer
GCViewer也是一款分析小工具今魔,用于可視化查看由Sun / Oracle, IBM, HP 和 BEA Java 虛擬機(jī)產(chǎn)生的垃圾收集器的日志勺像,gcviewer個(gè)人感覺顯示 的界面比較亂沒有GChisto更專業(yè)一些。
GC Easy
這是一個(gè)web工具,在線使用非常方便.
地址:?http://gceasy.io
進(jìn)入官網(wǎng)错森,講打包好的zip或者gz為后綴的壓縮包上傳吟宦,過(guò)一會(huì)就會(huì)拿到分析結(jié)果。
推薦使用此工具進(jìn)行g(shù)c分析涩维。