jprofiler 查看程序内存泄露
在最近的工作中,通過JProfiler解決了一個(gè)內(nèi)存泄漏的問題,現(xiàn)將檢測的步驟和一些分析記錄下來,已備今后遇到相似問題時(shí)可以作為參考。
運(yùn)行環(huán)境:
內(nèi)存泄漏的現(xiàn)象:
使用JProfiler檢查內(nèi)存泄漏的步驟:
1. 初始化檢驗(yàn)環(huán)境:
切換到“Live Memory-->All Objects”標(biāo)簽,可以看到當(dāng)前tomcat中的對(duì)象情況。
在執(zhí)行操作前,需要先運(yùn)行“Run GC”,使jvm進(jìn)行內(nèi)存回收,清理無效的對(duì)象;
為了便于比較內(nèi)存的增長情況,可以點(diǎn)擊"Mark Current"按鈕,來將當(dāng)前內(nèi)存使用情況作為參照;
點(diǎn)擊后會(huì)顯示“Difference”列,該列會(huì)列出對(duì)象數(shù)量的變化和變化比率;
2.打開內(nèi)存記錄:
點(diǎn)擊“Start Recordings”按鈕,開始記錄。執(zhí)行這步的主要目的是為下面“Heap Walker”,設(shè)置一個(gè)監(jiān)控區(qū)間;如果不記錄的話,“Heap Walker”將分析jvm虛擬機(jī)的所有內(nèi)存,即耗時(shí)又不能準(zhǔn)確的發(fā)現(xiàn)內(nèi)存泄漏的原因。
3. 執(zhí)行操作,執(zhí)行g(shù)c;
可以點(diǎn)擊下面的“update”按鈕,進(jìn)行視圖的更新;
執(zhí)行內(nèi)存回收后,仍然存在于內(nèi)存中的對(duì)象有可能是泄漏的對(duì)象;如下圖,instance count中紅色的部門為不能回收的對(duì)象,difference列列出了增加的對(duì)象數(shù)量和增幅;以String為例,在該操作中增加了31751個(gè)對(duì)象,增幅達(dá)到了14%,隨后會(huì)在HeapWalker中觀察這些對(duì)象,分析哪些對(duì)象是泄漏的;
一般引起泄漏的對(duì)象包括:String,char[],HashMap等,這些對(duì)象需要重點(diǎn)關(guān)注下;
4. 關(guān)閉內(nèi)存記錄:
5. 找到增加迅速的對(duì)象類型,打開HeapWalker:
在視圖中找到增長快速的對(duì)象類型,一般包括String、char[]、Map等;
切換前會(huì)彈出選項(xiàng)頁面,注意一定要選擇“Select recorded objects”;這樣Heap Walker會(huì)在剛剛的那段記錄中進(jìn)行分析;否則,如果不勾選的話,他會(huì)分析tomcat的所有內(nèi)存對(duì)象,這樣既耗時(shí)又不準(zhǔn)確;
6. 在HeapWalker中,找到泄漏的對(duì)象;
通過切換到References頁簽,可以看到具體的對(duì)象;
在這些內(nèi)存對(duì)象中,找到泄漏的對(duì)象(應(yīng)該被回收);可以在該對(duì)象上點(diǎn)擊右鍵,選擇“Use Selected Instances”縮小對(duì)象范圍;
7. 通過引用分析該對(duì)象:
incoming 表示顯示這個(gè)對(duì)象被誰引用;
outcoming 表示顯示這個(gè)對(duì)象引用的其他對(duì)象;
選擇“Show In Graph”將引用關(guān)系使用圖形方式展現(xiàn);
選中該對(duì)象,點(diǎn)擊“Show Paths To GC Root”,會(huì)找到引用的根節(jié)點(diǎn);
在上圖中,我們可以發(fā)現(xiàn),這個(gè)String對(duì)象最終的引用是在Thread線程中的ThreadLocalMap對(duì)象中;這給我們提供了線索,我們需要在程序中查找有關(guān)ThreadLocalMap部分的代碼,檢查為什么這個(gè)對(duì)象沒有被釋放;這往往就是泄漏的根源。
8. 通過創(chuàng)建分析該對(duì)象:
內(nèi)存泄漏的原因分析:
參考資料:
1. 轉(zhuǎn)載自: https://blog.csdn.net/coslay/article/details/43270311
2.《利用Java剖析工具JProfiler查找內(nèi)存泄漏的方法》http://jingyan.baidu.com/article/9c69d48f552d5f13c9024e3b.html
總結(jié)
以上是生活随笔為你收集整理的jprofiler 查看程序内存泄露的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java之路(二) 操作符
- 下一篇: iOS正则表达式解决实际问题