jvm系列(七):jvm调优-工具篇
16年的時(shí)候花了一些時(shí)間整理了一些關(guān)于jvm的介紹文章,到現(xiàn)在回顧起來(lái)還是一些還沒(mé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)控分析工具一般分為兩類(lèi),一種是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開(kāi)始,在JDK中自帶的java監(jiān)控和管理控制臺(tái),用于對(duì)JVM中內(nèi)存,線程和類(lè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- 1
- 2
- 3
- 1
- 2
- 3
連接進(jìn)去之后,就可以看到j(luò)console概覽圖和主要的功能:概述、內(nèi)存、線程、類(lèi)、VM、MBeans
- 概述,以圖表的方式顯示出堆內(nèi)存使用量,活動(dòng)線程數(shù),已加載的類(lèi),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)檢查線程之間是否有死鎖的情況。
- 類(lèi),主要展示已加載類(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),以供后期查看或與其他用戶(hù)共享。
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)為例,雙擊后直接展開(kāi),主界面展示了系統(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)存、類(lèi)、線程的圖表
線程和jconsole功能沒(méi)有太大的區(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è)專(zhuān)業(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ì)算出該類(lèi)所有對(duì)象的retained size
- Dominator Tree:列出最大的對(duì)象以及其依賴(lài)存活的Object (大小是以Retained Heap為標(biāo)準(zhǔn)排序的)
- Top Consumers : 通過(guò)圖形列出最大的object
-
duplicate classes :檢測(cè)由多個(gè)類(lèi)裝載器加載的類(lèi)
-
Leak Suspects :內(nèi)存泄漏分析
- Top Components: 列出大于總堆數(shù)的百分之1的報(bào)表。
- Component Report:分析對(duì)象屬于同一個(gè)包或者被同一個(gè)類(lèi)加載器加載
以上只是一個(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是一款專(zhuān)業(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的開(kāi)銷(xiāo)、最大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è)人感覺(jué)顯示 的界面比較亂沒(méi)有GChisto更專(zhuān)業(yè)一些。
以上的兩款gc分析日志,一個(gè)不太維護(hù)了,一個(gè)不太專(zhuān)業(yè),求推薦更好的gc分析工具
前期jvm系類(lèi)文章回顧:
- jvm系列(一):java類(lèi)的加載機(jī)制
- jvm系列(二):JVM內(nèi)存結(jié)構(gòu)
- jvm系列(三):GC算法 垃圾收集器
- jvm系列(四):jvm調(diào)優(yōu)-命令篇
- jvm系列(五):tomcat性能調(diào)優(yōu)和性能監(jiān)控(visualvm)
- jvm系列(六):jvm調(diào)優(yōu)-從eclipse開(kāi)始
作者:純潔的微笑?
出處:http://www.ityouknow.com/?
from:?http://blog.csdn.net/ityouknow/article/details/56844837
總結(jié)
以上是生活随笔為你收集整理的jvm系列(七):jvm调优-工具篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jvm系列(八):jvm知识点总览-高级
- 下一篇: 一次生产事故的优化经历