给,你们想要的内存溢出 MAT 排查工具
关注“Java 后端技术全栈”
回复“000”获取大量电子书
本文总结了排查内存溢出问题的 MAT 工具,先来看看本文目录:

Java 堆内存分析工具。
设置 JVM 启动参数
访问http://localhost:8080/mat
不过一会就报异常了。然后

与之同时,生成了一个文件
实战 MAT
下载地址:
http://www.eclipse.org/mat/do...
下载到本地并解压

双击MemoryAnalyzer.exe
打开

我们把前面生成的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 关键字。
并且我们发现
对象个数是 132033 个。
OQL
MAT 支持一种类似于 SQL
的查询语言OQL
(Object Query Language),这个查询语言 VisualVM
工具也支持。
OQL
将类表示为表,对象表示为行,字段表示为列。
语法:
用F5
或者Ctrl+enter
或者点击红色的感叹号立即执行OQL
。

输入关键词还可以提示:

查询结果

更多 OQL 相关的操作,推荐看官网:
https://help.eclipse.org/2020...
推荐阅读:
《Spring Cloud与Docker微服务架构实战》.pdf
版权声明: 本文为 InfoQ 作者【田维常】的原创文章。
原文链接:【http://xie.infoq.cn/article/56b4d093640a6f347fb87d278】。文章转载请联系作者。
评论