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