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