jvm系列(七):jvm調優(yōu)-工具篇
16年的時候花了一些時間整理了一些關于jvm的介紹文章,到現(xiàn)在回顧起來還是一些還沒有補充全面,其中就包括如何利用工具來監(jiān)控調優(yōu)前后的性能變化。工具做為圖形化界面來展示更能直觀的發(fā)現(xiàn)問題,另一方面一些耗費性能的分析(dump文件分析)一般也不會在生產直接分析,往往dump下來的文件達1G左右,人工分析效率較低,因此利用工具來分析jvm相關問題,長長可以到達事半功倍的效果來。
jvm監(jiān)控分析工具一般分為兩類,一種是jdk自帶的工具,一種是第三方的分析工具。jdk自帶工具一般在jdk bin目錄下面,以exe的形式直接點擊就可以使用,其中包含分析工具已經很強大,幾乎涉及了方方面面,但是我們最常使用的只有兩款:jconsole.exe和jvisualvm.exe;第三方的分析工具有很多,各自的側重點不同,比較有代表性的:MAT(Memory Analyzer Tool)、GChisto等。
對于大型 JAVA 應用程序來說,再精細的測試也難以堵住所有的漏洞,即便我們在測試階段進行了大量卓有成效的工作,很多問題還是會在生產環(huán)境下暴露出來,并且很難在測試環(huán)境中進行重現(xiàn)。JVM 能夠記錄下問題發(fā)生時系統(tǒng)的部分運行狀態(tài),并將其存儲在堆轉儲 (Heap Dump) 文件中,從而為我們分析和診斷問題提供了重要的依據(jù)。其中VisualVM和MAT是dump文件的分析利器。
jdk自帶的工具
jconsole
Jconsole(Java Monitoring and Management Console)是從java5開始,在JDK中自帶的java監(jiān)控和管理控制臺,用于對JVM中內存,線程和類等的監(jiān)控,是一個基于JMX(java management extensions)的GUI性能監(jiān)測工具。jconsole使用jvm的擴展機制獲取并展示虛擬機中運行的應用程序的性能和資源消耗等信息。
直接在jdk/bin目錄下點擊jconsole.exe即可啟動,界面如下:
在彈出的框中可以選擇本機的監(jiān)控本機的java應用,也可以選擇遠程的java服務來監(jiān)控,如果監(jiān)控遠程服務需要在tomcat啟動腳本中添加如下代碼:
- -Dcom.sun.management.jmxremote.port=6969
- -Dcom.sun.management.jmxremote.ssl=false
- -Dcom.sun.management.jmxremote.authenticate=false
連接進去之后,就可以看到jconsole概覽圖和主要的功能:概述、內存、線程、類、VM、MBeans
- 概述,以圖表的方式顯示出堆內存使用量,活動線程數(shù),已加載的類,CUP占用率的折線圖,可以非常清晰的觀察在程序執(zhí)行過程中的變動情況。
- 內存,主要展示了內存的使用情況,同時可以查看堆和非堆內存的變化值對比,也可以點擊執(zhí)行GC來處罰GC的執(zhí)行
- 線程,主界面展示線程數(shù)的活動數(shù)和峰值,同時點擊左下方線程可以查看線程的詳細信息,比如線程的狀態(tài)是什么,堆棧內容等,同時也可以點擊“檢測死鎖”來檢查線程之間是否有死鎖的情況。
- 類,主要展示已加載類的相關信息。
- VM 概要,展示JVM所有信息總覽,包括基本信息、線程相關、堆相關、操作系統(tǒng)、VM參數(shù)等。
- Mbean,查看Mbean的屬性,方法等。
VisualVM
簡介
VisualVM 是一個工具,它提供了一個可視界面,用于查看 Java 虛擬機 (Java Virtual Machine, JVM) 上運行的基于 Java 技術的應用程序(Java 應用程序)的詳細信息。VisualVM 對 Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關數(shù)據(jù)進行組織,并通過一種使您可以快速查看有關多個 Java 應用程序的數(shù)據(jù)的方式提供該信息。您可以查看本地應用程序以及遠程主機上運行的應用程序的相關數(shù)據(jù)。此外,還可以捕獲有關 JVM 軟件實例的數(shù)據(jù),并將該數(shù)據(jù)保存到本地系統(tǒng),以供后期查看或與其他用戶共享。
VisualVM 是javajdk自帶的最牛逼的調優(yōu)工具了吧,也是我平時使用最多調優(yōu)工具,幾乎涉及了jvm調優(yōu)的方方面面。同樣是在jdk/bin目錄下面雙擊jvisualvm.exe既可使用,啟動起來后和jconsole 一樣同樣可以選擇本地和遠程,如果需要監(jiān)控遠程同樣需要配置相關參數(shù),主界面如下;
VisualVM可以根據(jù)需要安裝不同的插件,每個插件的關注點都不同,有的主要監(jiān)控GC,有的主要監(jiān)控內存,有的監(jiān)控線程等。
如何安裝:
1、從主菜單中選擇“工具”>“插件”。
2、在“可用插件”標簽中,選中該插件的“安裝”復選框。單擊“安裝”。
3、逐步完成插件安裝程序。
我這里以 Eclipse(pid 22296)為例,雙擊后直接展開,主界面展示了系統(tǒng)和jvm兩大塊內容,點擊右下方jvm參數(shù)和系統(tǒng)屬性可以參考詳細的參數(shù)信息.
因為VisualVM的插件太多,我這里主要介紹三個我主要使用幾個:監(jiān)控、線程、Visual GC
監(jiān)控的主頁其實也就是,cpu、內存、類、線程的圖表
線程和jconsole功能沒有太大的區(qū)別
Visual GC 是常常使用的一個功能,可以明顯的看到年輕代、老年代的內存變化,以及gc頻率、gc的時間等。
以上的功能其實jconsole幾乎也有,VisualVM更全面更直觀一些,另外VisualVM非常多的其它功能,可以分析dump的內存快照,dump出來的線程快照并且進行分析等,還有其它很多的插件大家可以去探索
第三方調優(yōu)工具
MAT
MAT是什么?
MAT(Memory Analyzer Tool),一個基于Eclipse的內存分析工具,是一個快速、功能豐富的Java heap分析工具,它可以幫助我們查找內存泄漏和減少內存消耗。使用內存分析工具從眾多的對象中進行分析,快速的計算出在內存中對象的占用大小,看看是誰阻止了垃圾收集器的回收工作,并可以通過報表直觀的查看到可能造成這種結果的對象。
通常內存泄露分析被認為是一件很有難度的工作,一般由團隊中的資深人士進行。不過要介紹的 MAT(Eclipse Memory Analyzer)被認為是一個“傻瓜式“的堆轉儲文件分析工具,你只需要輕輕點擊一下鼠標就可以生成一個專業(yè)的分析報告。和其他內存泄露分析工具相比,MAT 的使用非常容易,基本可以實現(xiàn)一鍵到位,即使是新手也能夠很快上手使用。
MAT以eclipse 插件的形式來安裝,具體的安裝過程就不在描述了,可以利用visualvm或者是 jmap命令生產堆文件,導入eclipse mat中生成分析報告:
生產這會報表的同時也會在dump文件的同級目錄下生成三份(dump_Top_Consumers.zip、dump_Leak_Suspects.zip、dump_Top_Components.zip)分析結果的html文件,方便發(fā)送給相關同事來查看。
需要關注的是下面的Actions、Reports、Step by Step區(qū)域:
- Histogram:列出內存中的對象,對象的個數(shù)以及大小,支持正則表達式查找,也可以計算出該類所有對象的retained size
- Dominator Tree:列出***的對象以及其依賴存活的Object (大小是以Retained Heap為標準排序的)
- Top Consumers : 通過圖形列出***的object
- duplicate classes :檢測由多個類裝載器加載的類
- Leak Suspects :內存泄漏分析
- Top Components: 列出大于總堆數(shù)的百分之1的報表。
- Component Report:分析對象屬于同一個包或者被同一個類加載器加載
以上只是一個初級的介紹,mat還有更強大的使用,比如對比堆內存,在生產環(huán)境中往往為了定位問題,每隔幾分鐘dump出一下內存快照,隨后在對比不同時間的堆內存的變化來發(fā)現(xiàn)問題。
GChisto
GChisto是一款專業(yè)分析gc日志的工具,可以通過gc日志來分析:Minor GC、full gc的時間、頻率等等,通過列表、報表、圖表等不同的形式來反應gc的情況。雖然界面略顯粗糙,但是功能還是不錯的。
配置好本地的jdk環(huán)境之后,雙擊GChisto.jar,在彈出的輸入框中點擊 add 選擇gc.log日志
- GC Pause Stats:可以查看GC 的次數(shù)、GC的時間、GC的開銷、***GC時間和最小GC時間等,以及相應的柱狀圖
- GC Pause Distribution:查看GC停頓的詳細分布,x軸表示垃圾收集停頓時間,y軸表示是停頓次數(shù)。
- GC Timeline:顯示整個時間線上的垃圾收集
不過這款工具已經不再維護,不能識別***jdk的日志文件。
gcviewer
GCViewer也是一款分析小工具,用于可視化查看由Sun / Oracle, IBM, HP 和 BEA Java 虛擬機產生的垃圾收集器的日志,gcviewer個人感覺顯示 的界面比較亂沒有GChisto更專業(yè)一些。
GC Easy
這是一個web工具,在線使用非常方便.
地址: http://gceasy.io
進入官網,講打包好的zip或者gz為后綴的壓縮包上傳,過一會就會拿到分析結果。
推薦使用此工具進行gc分析。
【本文為51CTO專欄作者“純潔的微笑”的原創(chuàng)稿件,轉載請通過微信公眾號聯(lián)系作者獲取授權】