本文總結了排查內存溢出問題的MAT工具,先來看看本文目錄:
php
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
與之同時,生成了一個文件eclipse
下載地址:
ide
http://www.eclipse.org/mat/downloads.php工具
下載到本地並解壓spa
雙擊MemoryAnalyzer.exe
打開3d
咱們把前面生成的java_pid4928.hprof
文件導入進來
點擊finish
個人天啦,馬上就把咱們問題定位到了,MatController
這個類的嫌疑最大(其實線上環境通常都不會這麼容易)。
點擊圖中的最大區域
outgoing references 對象的引出
incoming references 對象的引入
另外Path to GC Roots
這是快速分析的一個經常使用功能,顯示和 GC Roots 之間的路徑。
左上角 有個圖標,樹狀圖
進入樹狀圖
一眼就知道咱們的MatController有問題,竟然排在最前面了。另外兩個關鍵屬性:
Shallow Heap:淺堆,表示對象自己的內存佔用。
Retained Heap:深堆,表示對象自身的內存佔用
並且在MatController類上還有個Regex,支持正則表達式,因而我就輸入了我特有的命名tian,按下回車鍵:
而後,便把tian相關的所有輸出。
同理,若是咱們在排查線上問題是,也能夠輸入咱們特有關鍵字等來快速定位問題。每一個公司基本上都有本身一套獨立的包目錄。咱們就可使用那個特有的關鍵字進行搜索。
點開MatController類,下面有個List,而後List存了User對象,這不就是咱們上面的代碼麼?
一樣在左上角有個柱狀圖
點擊進去
看到第一行有Regex,哈哈,又是支持正在表達式,咱們再次輸入tian關鍵字。
而且咱們發現
1com.tian.dto.User
對象個數是132033個。
MAT 支持一種相似於 SQL
的查詢語言OQL
(Object Query Language),這個查詢語言 VisualVM
工具也支持。
OQL
將類表示爲表,對象表示爲行,字段表示爲列。
語法:
1SELECT *
2FROM [ INSTANCEOF ] <class name="name">
3[ WHERE <filter-expression> ]
4</filter-expression></class>
用F5
或者Ctrl+enter
或者點擊紅色的感嘆號當即執行OQL
。
輸入關鍵詞還能夠提示:
查詢結果