<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          分析和定位線上作業(yè) OOM 問題利器-MAT

          共 3212字,需瀏覽 7分鐘

           ·

          2020-07-28 23:17


          點擊上方藍色字體,選擇“設(shè)為星標(biāo)

          回復(fù)”資源“獲取更多資源

          64c8630cf78af9d421f2e12b8d3628c5.webp

          8a4505ee8231ae127c388cb7be208084.webp

          大數(shù)據(jù)技術(shù)與架構(gòu)點擊右側(cè)關(guān)注,大數(shù)據(jù)開發(fā)領(lǐng)域最強公眾號!

          08dc39b01f7fa6068b51ef59bb6bbcae.webp

          暴走大數(shù)據(jù)點擊右側(cè)關(guān)注,暴走大數(shù)據(jù)!b8273973d5c5dbc5e5b056d5d2774ad5.webp本文作者:學(xué)無止境?原文鏈接:https://www.cnblogs.com/duanxz/p/6046055.html在工作中可能會遇到內(nèi)存溢出這種災(zāi)難性的問題,那么程序肯定是存在問題,找出問題至關(guān)重要,上一篇文章講了jmap命令的使用方法,當(dāng)然用jmap導(dǎo)出的文件我們也看不懂啊,那就交給memory analyzer(mat)這個工具,讓他幫助我們來觀察程序的內(nèi)存分布情況吧。
          MAT 不是一個萬能工具,它并不能處理所有類型的堆存儲文件。但是比較主流的廠家和格式,例如 Sun, HP, SAP 所采用的 HPROF 二進制堆存儲文件,以及 IBM 的 PHD 堆存儲文件等都能被很好的解析。下面來看看要怎么做呢,也許對你有用。官方文檔:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html
          造成OutOfMemoryError原因一般有2種:1、內(nèi)存泄露,對象已經(jīng)死了,無法通過垃圾收集器進行自動回收,通過找出泄露的代碼位置和原因,才好確定解決方案;2、內(nèi)存溢出,內(nèi)存中的對象都還必須存活著,這說明Java堆分配空間不足,檢查堆設(shè)置大小(-Xmx與-Xms),檢查代碼是否存在對象生命周期太長、持有狀態(tài)時間過長的情況。

          jmap 命令生成堆信息

          jmap?-dump:live,format=b,file=E:/jmap/heap.dump?pid
          8e94508c6b14d310a16bbf06dcecf61c.webp這樣在E盤的jmap文件夾里會有一個map.bin的堆信息文件這樣在E盤的jmap文件夾里會有一個map.bin的堆信息文件

          將堆信息導(dǎo)入到mat中分析

          bd08beef4455ea3d380c32ba15ac2d43.webp

          生成分析報告

          mat可以為我們生成多個報告:

          bfbcb1ae319c924644886f5fed23a86f.webp

          下面來看看生成的這些數(shù)據(jù)對我們有什么幫助
          ee758e5f7951b63dcd75b817065bf083.webp從上圖可以看到它的大部分功能,在餅圖上,你會發(fā)現(xiàn)轉(zhuǎn)儲的大小和數(shù)量的類,對象和類加載器。正確的下面,餅圖給出了一個印象最大的對象轉(zhuǎn)儲。移動你的鼠標(biāo)看到對象中的對象的細節(jié)檢查在左邊。下面的Action標(biāo)簽中:
          • Histogram可以列出內(nèi)存中的對象,對象的個數(shù)以及大小。

          • Dominator Tree可以列出那個線程,以及線程下面的那些對象占用的空間。

          • Top consumers通過圖形列出最大的object。

          • Leak Suspects通過MA自動分析泄漏的原因。

          Histogram

          05ff553bf9d815bf7c6c566bdc46cddb.webp
          • Class Name :類名稱,java類名

          • Objects :類的對象的數(shù)量,這個對象被創(chuàng)建了多少個

          • Shallow Heap :一個對象內(nèi)存的消耗大小,不包含對其他對象的引用

          • Retained Heap :是shallow Heap的總和,也就是該對象被GC之后所能回收到內(nèi)存的總和

          一般來說,Shallow Heap堆中的對象是它的大小和保留內(nèi)存大小相同的對象是堆內(nèi)存的數(shù)量時,將釋放對象被垃圾收集。保留設(shè)置一組主要的對象,例如一個特定類的所有對象,或所有對象的一個特定的類裝入器裝入的類或者只是一群任意對象,是釋放的組對象如果所有對象的主要設(shè)置變得難以接近的。保留設(shè)置包括這些對象以及所有其他對象只能通過這些對象。保留大小是總堆大小中包含的所有對象的保留。摘自eclipse關(guān)于的詳細講解,建議大家查看Shallow heap & Retained heap,這是個很重要的概念。d183b2105e1f85bc459228c5de9ee047.webp這兒借助工具提供的regex正則搜索一下我們自己的類,排序后看看哪些相對是占用比較大的。d22e7d65f8206ec64339d36c19fdb593.webp左邊可以看到類的詳細使用,比如所屬包,父類是誰,所屬的類加載器,內(nèi)存地址,占用大小和回收情況等c554b6623a1b412a07b6d99ac854de1f.webp這兒有個工具可以根據(jù)自己的需求分組查找,默認(rèn)根據(jù)class分組,類似我們sql里的group by了~~eeb92967b803a8d15d65945550e295ee.webp這里可以看到上面3個選項,分別生成overview、leak suspects、top components數(shù)據(jù),但是這兒生成的不是圖表,如果要看圖表在(Overview)中的Action標(biāo)簽里點擊查看。這個是Overview中的 Heap Dump Overview視圖,從工具欄中點開,這是一個全局的內(nèi)存占用信息

          6499c078ea616dcf756e2d41f5d65b14.webp

          然后可以點開SystemProperties和Thread Overview進行查看,我這里就不貼了內(nèi)容比較多。

          Dominator Tree

          90b90590b36950dcc866867443320a04.webp我們可以看到ibatis占了較多內(nèi)存

          Top consumers

          b5b952826a28e7f7b5a283213fd26024.webp這張圖展示的是占用內(nèi)存比較多的對象的分布,下面是具體的一些類和占用。86e4ff23373c42b8d59d2e27cce5aff8.webp按等級分布的類使用情況,其實也就是按使用次數(shù)查看,java.lang.Class被排在第一cd1df2808d882471e57f5fe275691c9d.webp還有一張圖是我們比較關(guān)心的,那就是按包名看占用,根據(jù)包我們知道哪些公共用的到j(luò)ar或自己的包占用d6a9f30e8a95174a98056c4f43cdf539.webp這樣就可以看到包和包中哪些類的占用比較高。

          Leak Suspects

          1782618c2aca111279c05d30a25b0a5e.webp從這份報告,看到該圖深色區(qū)域被懷疑有內(nèi)存泄漏,可以發(fā)現(xiàn)整個heap只有79.7M內(nèi)存,深色區(qū)域就占了62%。所以,MAT通過簡單的報告就說明了項目是有可疑代碼的,具體點開詳情來找到類,1d3731f00d386ff1fae2bf4dbaf89f35.webp點擊鼠標(biāo),在List Objects-> with outgoing references下可以查看該類都引用了什么對象,由此查看是否因為其他對象導(dǎo)致的內(nèi)存問題。下面繼續(xù)查看pool的gc ROOT如下圖所示的上下文菜單中選擇 Path To GC Roots -> exclude weak references, 過濾掉弱引用,因為在這里弱引用不是引起問題的關(guān)鍵。進入查看即可,我這兒的代碼沒有問題,就不用貼了。840876ff552ef1f916628ef5d293b0d2.webp
          The?classloader/component?"org.apache.catalina.loader.WebappClassLoader?@?0xa34cde8"?occupies?19,052,864?(22.80%)?bytes.?The?memory?is?accumulated?in?one?instance?of?"java.util.HashMap$Entry[]"?loaded?by?"".

          Keywords
          java.util.HashMap$Entry[]
          org.apache.catalina.loader.WebappClassLoader?@?0xa34cde8
          這段話是在工具中提示的,他告訴我們WebappClassLoader占了19,052,864 字節(jié)的容量,這是tomcat的類加載器,JDK自帶的系統(tǒng)類加載器中占用比較多的是HashMap。這個其實比較正常,大家經(jīng)常用map作為存儲容器。除了在上一頁看到的描述外,還有Shortest Paths To the Accumulation Point和Accumulated Objects部分,這里說明了從GC root到聚集點的最短路徑,以及完整的reference chain。觀察Accumulated Objects部分,java.util.HashMap的retained heap(size)最大,所以明顯類實例都聚集在HashMap中了。66a164bee1fca0c08e614fb8096194c8.webp來看看Accumulated Objects by Class區(qū)域,這里能找到被聚集的對象實例的類名。java.util.HashMap類上頭條了,被實例化了5573次,從這兒看出這個程序不存在什么問題,因為這個數(shù)字是比較正常的,但是當(dāng)出問題的時候我們都會看到比較大的自定義類會在前面,而且占用是相當(dāng)高。當(dāng)然,mat這個工具還有很多的用法,這里把我了解的分享給大家,不管如何,最終我們需要得出系統(tǒng)的內(nèi)存占用,然后對其進行代碼或架構(gòu),服務(wù)器的優(yōu)化措施!歡迎點贊+收藏+轉(zhuǎn)發(fā)朋友圈素質(zhì)三連


          文章不錯?點個【在看】吧!??

          瀏覽 26
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一区二区三区四区免费 | 91乱子伦国产乱子伦 | 怡春院视频 | 国产精品永久在线 | 精品无码在线观看 |