查看javacore文件
1.下載ThreadDumpAnalyser,graphviz,svgviewer
2.運行runall.bat javacore.txt,會產生三個文件mps.xml,locktree1.svg,sidebyside.html
二。查看heapmp文件
1.從IBM網站下載ha433包,釋放,執行ha433.jar文件
2.在ha433窗口打開heapmp.phd,從中會顯示分析結果
㈡ 如何通過mat從java內存mp中找到緩存對象中的所有字元串
生成java內存mp文件
標准做法,jmap mp,需要sudo許可權,另外jmap指定的mp文件一定要是啟動服務的用戶可寫,比如可以新創建一個文件夾
sudo mkdir /home/q/memmp
sudo chown resin:resin /home/q/memmp
sudo -u resin /home/q/java/default/bin/jmap -mp:live,format=b,file=/home/q/memmp/memMap.20130527.hprof ${pid}
把mp文件拿到本地
把mp文件壓縮下,否則會很大,scp到本地
安裝mat
直接在eclipse里:
1.Help->Install New Software
2.輸入update site: http://download.eclipse.org/mat/1.2/update-site/,然後一直next就行了,安裝完重啟eclipse
3.最好創建一個單獨的workspace來放內存mp文件
把mp文件導入mat
1.打開eclipse,選擇上一步你創建的存放內存mp文件的workspace,我本機上是~/mat
2.打開剛才拿到本地的mp文件,然後等著mat解析就完了,注意這時候你可能需要修改eclipse安裝文件下的eclipse.ini,調整下eclipse的jvm參數(xms和xmx),把heap調大些,否則解析過程會報OOM
3.解析完後會生成一個Overview,我們一般會選擇org.apache.catalina.loader.WebappClassLoader,作為分析top
consumer的切入點,這是tomcat上web應用的classloader
4.單擊餅圖上org.apache.catalina.loader.WebappClassLoader的區域,會出現一個彈出菜單,選擇List
Objects->with incoming references,因為所有的web應用內的對象都會引用它們自己的class
loader,也就是org.apache.catalina.loader.WebappClassLoader
5.得到如下所示列表,單擊retained heap這個tab標簽可以排序,選擇按照佔用內存的大小倒排序,得到了top memory
consumers列表
定位緩存對象
我們關心的是top consumer里的RtTreeCache里,有多少重復房型,怎麼得到的呢,follow the steps:
1.查看RtTreeCache對象的outgoing
reference,因為我們需要看這個對象裡面的屬性,屬性對象也就是RtTreeCache對象引用的對象,也就是outgoing reference
2.找到我們需要分析的數據在對象結構中的位置
3.可以看到我們要查找的目標是RtTreeCache對象下的所有HotelRtTree對象的rtReverseMap對象屬性下的table數組內所有entry的key,我們接下來就看看怎麼把這個冗長的關系轉化成一個簡單的OQL語句
寫MAT OQL
OQL是MAT里的一個內嵌查詢語言,它的官方描述很形象:
Memory Analyzer has a built-in object query
language (OQL) that allows to query the heap mp with custom SQL-like queries. Just
think of classes as tables, objects as rows, and fields as columns.
總結
jmap + mat是我們分析java內存的利器,而通過mat
oql,我們可以從mp文件里提取出更多的類似於有多少內容相同的不同字元串對象等信息來幫助我們做技術決策。
㈢ Linux裡面什麼是mp線程
線程mp是非常有用的診斷java應用問題的工具,每一個java虛擬機都有及時生成顯示所有線程在某一點狀態的線程mp能力。雖然每個java虛擬機線程mp列印輸出格式上略微有一些不同,但是線程mp的信息包含線程基本信息、線程的運行狀態、標識、調用的堆棧;調用的堆棧包含完整的類名,所執行的方法,如果可能的話還有源代碼的行數。
㈣ 什麼是java mp文件 怎麼生成
java mp heap 是分配給實例類和數組對象運行數據區,所有java線程在運行期間共享heap中的數據。Java heap mp相當於java應用在運行的時候在某個時間點上打了個快照(snapshot)。
有java mp文件生成的方式如下:
1.使用$JAVA_HOME/bin/jmap -mp來觸發,eg:jmap -mp:format=b,file=/home/longhao/heammp.out
2.使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun.management>HotSpotDiagnostic>操作>mpHeap中,點擊 mpHeap按鈕。生成的mp文件在java應用的根目錄下面。
3.在應用啟動時配置相關的參數 -XX:+HeapDumpOnOutOfMemoryError,當應用拋出OutOfMemoryError時生成mp文件。
4.使用hprof。啟動虛擬機加入-Xrunhprof:head=site,會生成java.hprof.txt文件。該配置會導致jvm運行非常的慢,不適合生產環境。
㈤ 浣跨敤jdk甯哥敤宸ュ叿鎺掓煡鏁呴殰嫻佺▼
jps瀹氫綅榪涚▼
jstat緇熻″爢淇℃伅
jstack瀹氫綅闂棰樼嚎紼
jmap瀹氫綅闂棰樺硅薄
jps鐢ㄤ簬鏌ョ湅鏈嶅姟鍣ㄥ綋鍓嶆湁鍝浜沯ava榪涚▼錛屾帓鏌ラ棶棰樻椂錛屼竴鑸鍏堜嬌鐢╦ps瀹氫綅鍒皃id
-l鍙傛暟鍙浠ユ墦鍗板畬鏁寸被璺寰勬垨jar鍖呰礬寰勶紝-v鍙傛暟鍙浠ユ墦鍗板惎鍔ㄥ弬鏁
澶囨敞: ps -ef | grep java 鍙浠ユ墦鍗板惎鍔ㄥ弬鏁板拰jar璺寰勶紝浣嗘墦鍗頒笉浜嗙被璺寰
jstat鐢ㄤ簬緇熻″爢鍚勫尯鍩熺殑浣跨敤鎯呭喌絳変俊鎮
涓嬪浘涓錛 jstat -gc 1 1000 5 鍛戒護琛ㄧず姣1000ms鎵撳嵃涓嬈pid涓1鐨勮繘紼嬬殑鍫嗙殑淇℃伅錛屽叡鎵撳嵃5嬈°
S0C琛ㄧずS0鐨刢apacity錛屽嵆鎬誨歸噺錛孲0U琛ㄧずS0鐨剈sed錛屽嵆宸蹭嬌鐢ㄧ┖闂達紝鍗曚綅涓簁b錛孶/C鍙浠ュ緱鍒頒嬌鐢ㄧ巼錛屽侻U/MC = 鍏冪┖闂翠嬌鐢ㄧ巼銆
E銆丱銆丮鍒嗗埆琛ㄧずEden鍖恆佽佸勾浠c佸厓絀洪棿錛孻GC/YGCT琛ㄧずYGC鐨凣C嬈℃暟/GC鏃墮棿錛孎GC/FGCT琛ㄧずFGC鐨凣C嬈℃暟/GC鏃墮棿銆
-gc鍙傛暟鏄劇ず鍏蜂綋鏁板礆紝-gcutil灞曠ず姣斾緥
jstack鐢ㄤ簬鏌ョ湅鏌愪釜榪涚▼鍐呯殑綰跨▼淇℃伅錛屽父鐢ㄤ簬鎺掓煡cpu闂棰
浣跨敤jstack鏃訛紝涓鑸姝ラゅ備笅
姝ラ1錛岀敤 top -Hp pid 鏌ョ湅pid榪涚▼鍐呯殑綰跨▼鐨刢pu鍗犳瘮錛屾寜cpu浣跨敤鐜囦粠澶у埌灝忔帓搴忋
鏈姝ラら渶瑕佺潃閲嶈傚療鐨勬槸: cpu鍗犳瘮杈冮珮鐨勭嚎紼嬶紝浠ュ強cpu榪愯屾椂闂達紙鍗砊IME+鍒楋級杈冮暱鐨勭嚎紼
榪欓噷鏈変竴涓闂棰橈紝cpu澶氶珮綆楅珮錛
鍋囪炬湁涓涓4鏍哥殑cpu錛屼竴涓鏍歌窇婊℃槸100%錛屾暣涓猚pu鏈楂樿窇鍒400%銆
濡傛灉鏈変竴涓綰跨▼姝誨驚鐜錛坵hile true錛夛紝cpu涓鑸鑳藉埌90%+錛屽埌涓嶄簡100%鏄鍥犱負鍗充嬌鏄痺hile true錛岃繕鏄浼氭湁鏃墮棿鐗囪疆杞銆
鍙﹀栵紝cpu榪愯屾椂闂翠篃鏄涓涓寰堥噸瑕佺殑鎸囨爣錛屼笂鍥句腑錛宲id涓71鐨勭嚎紼嬶紝璺戜簡2灝忔椂18鍒嗛挓錛岃偗瀹氭湁闂棰樸
姝ラ2錛屾妸褰撳墠綰跨▼淇℃伅瀵煎嚭thread mp鏂囦歡
姝ラ3錛屾牴鎹涓婁竴姝ユ壘鍒扮殑闂棰樼嚎紼嬬殑pid錛屾妸pid杞鎴16榪涘埗錛屽洜涓簍hread mp鏂囦歡涓錛岀嚎紼媝id鏄鐢16榪涘埗琛ㄧず鐨
姝ラ4錛屽湪thread mp鏂囦歡涓媯緔涓婁竴姝ョ畻鍑虹殑綰跨▼pid鐨16榪涘埗錛屼竴鑸鐪嬪悗20琛岋紝鑳界湅鍒板畬鏁磋皟鐢ㄦ爤鍗沖彲
鍙浠ョ湅鍒幫紝璇ョ嚎紼嬫槸kafka娑堣垂鑰呯嚎紼
娉ㄦ剰: 寮鍙戞椂錛岀嚎紼嬪悕涓瀹氳佸畾濂斤紝鑳藉瑰簲鍏蜂綋涓氬姟錛岃繖鏍風敤jstack鐨勬椂鍊欙紝鍙浠ユ牴鎹綰跨▼鍚嶉┈涓婂畾浣嶅埌鍏蜂綋涓氬姟銆
鍙﹀栵紝Thread綾葷殑getAllStackTraces鏂規硶鍙浠ヨ幏鍙栧綋鍓嶈櫄鎷熸満鎵鏈夌嚎紼嬬殑璋冪敤鏍堬紝濡傛灉寮鍙戜漢鍛樹笉鏂逛究涓婄敓浜э紝鍙浠ョ敤璇api鏆撮湶鎺ュ彛銆
jmap鐢ㄤ簬鏌ョ湅鏌愪釜榪涚▼鐨勫硅薄淇℃伅錛屽父鐢ㄤ簬鎺掓煡鍐呭瓨闂棰
jmap -mp:live,format=b,file=/root/1.hprof 1 鎶婂爢鐨勫唴瀹規墦鍗板埌鏂囦歡錛宭ive鍙傛暟琛ㄧず鍙杈撳嚭媧葷殑瀵硅薄銆
澶囨敞錛
heap mp鏂囦歡鐨勫ぇ灝忎笌褰撳墠鍫嗕嬌鐢ㄩ噺鐨勫ぇ灝忎竴鑷達紝鍋囧傚爢浣跨敤閲忎負2G錛宧eap mp鏂囦歡灝辨湁2G錛屽煎嚭heap mp鏂囦歡闇瑕佸緢闀跨殑鏃墮棿錛屽煎嚭榪囩▼鍙鑳戒細褰卞搷瀵瑰栨湇鍔°
鍙﹀栵紝heap mp鏂囦歡鍙鏈夌敤涓撲笟鐨勫伐鍏鳳紙濡俲hat銆乯visualvm銆乵at錛夋墠鑳界湅錛屾棤娉曠敤grep絳夊懡浠ゆ緔銆
緇間笂錛屼竴鑸寰堝皯鍦ㄧ敓浜х幆澧冧嬌鐢ㄨュ懡浠ゃ
jmap -histo:live pid 緇熻$被瀹炰緥鏁頒互鍙婂瓧鑺傛暟銆
涓鑸鐢 jmap -histo:live pid | grep packge 媯鏌ユ槸鍚﹀唴瀛樻硠婕忥紝page涓簀ava欏圭洰鐨勫寘鍚
jmap -J-D64 -heap 1 鎵撳嵃heap鐨勬傝佷俊鎮
鎸変笂闈㈢殑姝ラわ紝涓鑸鍙浠ュ畾浣嶅埌闂棰橈紝浣嗘槸姣旇緝鍥伴毦錛岄渶瑕佸湪鐭鏃墮棿鍐呭仛澶ч噺鎿嶄綔錛屽洜姝わ紝鎺ㄨ崘浣跨敤 闃塊噷鐨刟rthas 銆