利用Eclipse對MAT進行分析解決JAVA內存問題

   咱們在開發過程當中每每會遇到 java.lang.OutOfMemoryError: Java heap space或者stackoverflow 這樣或那樣內存不夠的錯誤。這種錯誤在開發人員對jvm裏面的一些機制不清楚的狀況下常常是摸不着頭腦。下面的工具能夠清楚比較直觀的瞭解咱們運行的程序在jvm裏面所存在的區和每一個屬性所佔jvm的大小<根據系統版本不一樣所佔大小也不一樣>。 java

    下面的介紹是Eclipse官方的介紹.
程序員

Memory Analyzer (MAT) eclipse

  1. The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption.
  2. Use the Memory Analyzer to analyze productive heap dumps with hundreds of millions of objects, quickly calculate the retained sizes of objects, see who is preventing the Garbage Collector from collecting objects, run a report to automatically extract leak suspects.

      官方說MAT是一款快速,功能豐富的Java堆分析儀,能夠幫助你查找內存泄漏和減小內存消耗。能夠對象大小而且生成報告。 jvm

       官方地址:http://www.eclipse.org/mat/ ide

安裝方式: 函數

  1. 能夠從官網上下載對應系統的zip包。而後經過eclipse的安裝插件的方式進行安裝
  2. 能夠從更新插件的方式進行安裝。直接在eclipse裏面輸入地址。地址是:http://download.eclipse.org/mat/1.3/update-site/

以上兩種方式我想每個用eclipse作ide的程序員都會用吧。固我就不把安裝插件的方法寫在文章裏了。不懂能夠google。 工具

接下來是重點: ui

  1. 先運行你的程序。
  2. 而後用jdk提供的命令查找到運行程序的進程
        jps命令。若是以爲jps顯示的信息太少能夠加參數:
    jps  -q  只輸出LVMID,省略主類的名稱
    jps  -m 輸出虛擬機進程啓動時傳遞給主類main()函數的參數
    jps  -l   輸出主類的全名,若是進程執行的是jar包,則輸出jar包路徑。
    jps  -v  輸出虛擬機進程啓動時JVM參數

    5600就是我剛剛運行程序的進程。

  3. 執行 jmap -dump:format=b,file=heap.bin 5600 命令。會在當前目錄下生成一個heap.bin的文件。此文件能夠在file=xxx 修改。
  4. 而後打開eclipse。用file  -> open file 打開這個文件。就能夠看到下面的報告了。


       咱們來看幾個比較經常使用的報表 google

      Histogram:查看每一個類的實例數量。見下圖
        從這個圖能夠很直觀的看出來每個在heap區中的實例數量 spa

         Dominator Tree:系統中比較大的對象還存活的對象
       

    從上圖能夠看出每一個線程這幾個線程所佔的內存比較大在線程棧比較大。
    我就不一個個的介紹了。你們能夠本身去試試。

    固然這只是查看內存狀況的某一個工具。還有其餘比較優秀的工具好比jvisualvm、jprofiler 等等。這個因人而異。

相關文章
相關標籤/搜索