給,大家想要的內存溢出MAT排查工具

本文總結了排查內存溢出問題的MAT工具,先來看看本文目錄:
php


b71d0b414a22dd506965eb830d16f6be.png

Java 堆內存分析工具。java

 1@RestController
2public class MatController {
3
4    List<User> list = new ArrayList<>();
5
6    @GetMapping("/mat")
7    public String mat() {
8        for (int i = 0; i < 10000000; i++) {
9            User user = new User();
10            user.setId(1L);
11            user.setUserName("老田" + i);
12            list.add(user);
13        }
14        return "ok";
15    }
16}

設置JVM啓動參數正則表達式

1-Xms20m -Xmx20m -XX:MaxPermSize=20m -XX:+HeapDumpOnOutOfMemoryError

訪問http://localhost:8080/matexpress

不過一會就報異常了。而後app

f99dc2ee06fabf2625ffc158bbaaf42d.png

與之同時,生成了一個文件eclipse


實戰MAT

下載地址:
ide

http://www.eclipse.org/mat/downloads.php工具

下載到本地並解壓spa

雙擊MemoryAnalyzer.exe打開3d

f049543679fc57673a8c3535b11ef9ec.png

咱們把前面生成的java_pid4928.hprof文件導入進來

d4e642aa56698c7e563cf32398f611f5.png

點擊finish

bef4400cbc05de35bf684369d9db10ed.gif

b13eb9e632857faa73734d056493bb43.png

個人天啦,馬上就把咱們問題定位到了,MatController這個類的嫌疑最大(其實線上環境通常都不會這麼容易)。

點擊圖中的最大區域

  • outgoing references 對象的引出

  • incoming references  對象的引入

另外Path to GC Roots這是快速分析的一個經常使用功能,顯示和 GC Roots 之間的路徑。

樹狀圖fa4ab80456142242a099cdf509788609.png

左上角 有個圖標,樹狀圖

a17741e49e0bac5cd7ecc9be6aef13ab.png

進入樹狀圖

f03245bc1663b37377ab38bec765172a.png

一眼就知道咱們的MatController有問題,竟然排在最前面了。另外兩個關鍵屬性:

  • Shallow Heap:淺堆,表示對象自己的內存佔用。

  • Retained Heap:深堆,表示對象自身的內存佔用

並且在MatController類上還有個Regex,支持正則表達式,因而我就輸入了我特有的命名tian,按下回車鍵:

而後,便把tian相關的所有輸出。

同理,若是咱們在排查線上問題是,也能夠輸入咱們特有關鍵字等來快速定位問題。每一個公司基本上都有本身一套獨立的包目錄。咱們就可使用那個特有的關鍵字進行搜索。

點開MatController類,下面有個List,而後List存了User對象,這不就是咱們上面的代碼麼?


柱狀圖

d66e458e50792655cfaa419ea9ec0db6.png

一樣在左上角有個柱狀圖

fa4ab80456142242a099cdf509788609.png

點擊進去

5c2a78f80e8a972abc57af5bc8528059.png

看到第一行有Regex,哈哈,又是支持正在表達式,咱們再次輸入tian關鍵字。

而且咱們發現

1com.tian.dto.User

對象個數是132033個。

OQL

MAT 支持一種相似於 SQL  的查詢語言OQL(Object Query Language),這個查詢語言 VisualVM工具也支持。

OQL將類表示爲表,對象表示爲行,字段表示爲列。

語法:

1SELECT *
2FROM [ INSTANCEOF ] <class name="name">
3WHERE <filter-expression> ]
4</filter-expression></class>

F5或者Ctrl+enter或者點擊紅色的感嘆號當即執行OQL

151d92cdd6634a67ad8404fee5db84e9.png

輸入關鍵詞還能夠提示:

2cdb3e9a3951970ac96a576b0378804c.png

查詢結果

23a3c140110a72a3322ea753da5aba20.png

相關文章
相關標籤/搜索