关于jvm:给你们想要的内存溢出MAT排查工具

10次阅读

共计 1621 个字符,预计需要花费 5 分钟才能阅读完成。

关注“Java 后端技术全栈”

回复“000”获取大量电子书

本文总结了排查内存溢出问题的 MAT 工具,先来看看本文目录:

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/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 关键字。

并且咱们发现

1com.tian.dto.User

对象个数是 132033 个。

OQL

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

输出关键词还能够提醒:

查问后果

更多 OQL 相干的操作,举荐看官网:

https://help.eclipse.org/2020…

举荐浏览:

《精通 lambda 表达式:Java 多核编程》.pdf

《Java 程序员修炼之道》.pdf

《Spring Cloud 与 Docker 微服务架构实战》.pdf

正文完
 0