4大JVM性能分析工具详解,及内存泄漏分析方案
談到性能優化分析一般會涉及到:
Java代碼層面的,典型的循環嵌套等
還會涉及到Java JVM:內存泄漏溢出等
MySQL數據庫優化:分庫分表、慢查詢、長事務的優化等
阿里P8架構師談:MySQL慢查詢優化、索引優化、以及表等優化總結
阿里P8架構師談:架構設計之數據庫垂直、水平拆分六大原則(數據庫分庫分表)
常用的后端性能優化六種方式:緩存化+服務化+異步化等
阿里P8架構師談:MySQL數據庫的索引原理、與慢SQL優化的5大原則
阿里P8架構師談:Web前端、應用服務器、數據庫SQL等性能優化總結
阿里P8架構師談:多線程、架構、異步消息、Redis等性能優化策略
今天主要分享JVM性能調優工具,文末有詳細的JVM調優方法和步驟。
什么場景需要JVM調優
這些問題出現的時候常常通過重啟服務器或者調大內存來臨時解決,實際情況,還需要盡量還原當時的業務場景,并分析內存、線程等數據,通過分析找到最終的解決方案,這就會涉及到性能分析工具。
JVM性能監控分析工具
JDK本身提供了很豐富的性能監控工具,除了集成式的visualVM和jConsole外,還有jstat,jstack,jps,jmap,jhat小工具,這些都是性能調優的常用工具。
下面介紹這些JVM工具的使用。
JVM性能調優工具
VisualVM
VisualVM 是javajdk自帶的牛逼的調優工具,也是平時使用最多調優工具,幾乎涉及了jvm調優的方方面面。啟動起來后和jconsole 一樣同樣可以選擇本地和遠程,如果需要監控遠程同樣需要配置相關參數。
1 打開VisualVM
這個工具放在JDK安裝目錄的bin目錄下,雙擊jvisualvm.exe即可打開,如下圖所示
2. 監視頁面主要展示 系統資源占用情況
- CPU :展示java程序運行的時候占用的cpu資源
- 堆 :這里要說明下堆內存的組成部分,堆是由老年代和新生代組成,其中新生代有由”伊甸園”和”兩個幸存區組成”三部分組成,堆視圖看到的資源占用實際是”老年代”、”伊甸園(Eden)”、”兩個幸存者(Survivor )”的一個綜合情況。
- PermGen :Perm 區用來存放java類以及其他虛擬機自己的靜態數據,(常被稱為持久代或者方法區)
- 類 :此視圖 主要展示 當前程序加載了多少個類
- 線程: 當前程序的線程啟動情況
- 堆Dump : 生產當前程序的內存快照hprof文件,對于分析內存溢出問題比較有幫助。
3. 線程頁面(主要展示程序中所有的線程運行狀態)
- 線程dump : 所有線程的快照(對分析線程死鎖,比較有幫助)
- 時間線 : 展示每個線程的實時運行狀態(不同顏色代表不同的狀態)
VisualVM可以根據需要安裝不同的插件,每個插件的關注點都不同,有的主要監控GC,有的主要監控內存,有的監控線程等。
Jconsole
JConsole是一個JMX(Java
Management
Extensions,即Java管理擴展)的JVM監控與管理工具,監控主要體現在:堆棧內存、線程、CPU、類、VM信息這幾個方面,而管理主要是對JMX
MBean(managed
beans,被管理的beans,是一系列資源,包含對象、接口、設備等)的管理,不僅能查看bean的屬性和方法信息,還能夠在運行時修改屬性或調用方法。
1.打開Jconsole
直接在jdk/bin目錄下點擊jconsole.exe即可啟動,界面如下:
1、內存
在內存頁我們可以看到程序運行期間JVM各個部分的內存狀況,右下角是對應各個分區的內存使用柱狀圖,點擊對應柱可查看詳情,看圖:
2、線程
該頁面可以查看當前JVM進程啟動了多少個線程,并能查看每個線程的狀態及堆棧信息,此外還有一個功能就是能夠自動檢測死鎖,見圖:
3、類
該頁面其實和線程頁有些相似,不過顯示的是JVM加載類的信息,見圖:
4、VM概述
這個其實沒必要細說,看圖就明白,顯示了當前JVM的各方面信息:
5、MBean管理
MAT
MAT(Memory Analyzer Tool),一個基于Eclipse的內存分析工具,是一個快速、功能豐富的Java heap分析工具,它可以幫助我們查找內存泄漏和減少內存消耗。
可以利用visualvm或者是 jmap命令生產堆文件在進行內存分析。
1. 用jmap生成堆信息
這樣在E盤的jmap文件夾里會有一個map.bin的堆信息文件
2. 將堆信息導入到mat中分析
3. 生成分析報告
可以利用visualvm或者是 jmap命令生產堆文件,導入eclipse mat中生成分析報告:
1)Histogram(直方圖)視圖
- Class Name : 類名稱,java類名
- Objects : 類的對象的數量,這個對象被創建了多少個
- Shallow Heap :一個對象內存的消耗大小,不包含對其他對象的引用
- Retained Heap :是shallow Heap的總和,也就是該對象被GC之后所能回收到內存的總和
通過直方圖視圖可以很容易找到占用內存最多的幾個類(通過Retained Heap排序),還可以通過其他方式進行分組(見下圖)。
如果存在內存溢出,時間久了溢出類的實例數量或者內存占比會越來越多,排名也越來越靠前。
圖標進行對比,通過多次對比不同時間點下的直方圖對比就很容易把溢出的類找出來。
2)支配樹(Dominator Tree)
MAT提供了一個稱為支配樹(Dominator Tree)的對象圖。支配樹體現了對象實例間的支配關系,在此視圖中列出了每個對象(Object Instance)與其引用關系的樹狀結構,同時包含了占用內存的大小和百分比。
通過Dominator Tree視圖可以很容易的找出占用內存最多的幾個對象(根據Retained Heap或Percentage排序),和Histogram類似,可以通過不同的方式進行分組顯示:
Histogram視圖和Dominator Tree視圖的角度不同,前者是基于類的角度,后者是基于對象實例的角度,并且可以更方便的看出其引用關系。
以上只是一個初步的介紹,mat還有更強大的使用,比如對比堆內存,在生產環境中往往為了定位問題,每隔幾分鐘dump出一下內存快照,隨后在對比不同時間的堆內存的變化來發現問題。
JVM內存泄漏分析
造成OutOfMemoryError內存泄露典型原因:對象已經死了,無法通過垃圾收集器進行自動回收,需要通過找出泄露的代碼位置和原因,才好確定解決方案。
分析步驟:
1. 用工具生成java應用程序的heap dump(如jmap)
2. 使用Java heap分析工具(如MAT),找出內存占用超出預期的嫌疑對象
3. 根據情況,分析嫌疑對象和其他對象的引用關系。
4. 分析程序的源代碼,找出嫌疑對象數量過多的原因。
更多詳細JVM調優分析和參數設置請參考:JVM性能調優的6大步驟,及關鍵調優參數詳解
你可能也喜歡:
總結
以上是生活随笔為你收集整理的4大JVM性能分析工具详解,及内存泄漏分析方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何优雅的追到女神夕小瑶
- 下一篇: 阿里P8架构师谈:Zookeeper的原