使用MAT定位线上OOM问题

目录

1.什么是OOM?

2.发生的可能原因

3.常见类型的OOM

4.如何定位问题?

[4.1 获取dump文件](#4.1 获取dump文件)

[4.2 MAT分析](#4.2 MAT分析)

[「Leak Suspects」泄露嫌疑](#「Leak Suspects」泄露嫌疑)

「Histogram」直方图

[「dominator tree」支配树](#「dominator tree」支配树)

[「thread overview」线程视图](#「thread overview」线程视图)


目录

1.什么是OOM?

2.发生的可能原因

3.OOM类型

4.如何定位问题?

[4.1 获取dump文件](#4.1 获取dump文件)

[4.2 MAT分析](#4.2 MAT分析)


1.什么是OOM?

OOM,全称"Out Of Memory",就是"内存用完了"。当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error

2.发生的可能原因

  • 内存溢出:一次性申请的太多对象
  • 内存泄露:对象使用完一直未释放的,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。
  • 本身资源不够(jmap -heap查看堆信息)分配的内存太小

3.常见类型的OOM

常见的有以下两种:

  • java.lang.OutOfMemoryError: Java heap space ------>java堆内存溢出
  • java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出

4.如何定位问题?

4.1 获取dump文件

  • 系统已经OOM挂了

运行参数提前设置:

bash 复制代码
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/project.hprof
  • 系统运行中还未OOM

执行以下命令导出dump文件:

bash 复制代码
> jps
> jmap -dump:format=b,file=project.hprof ${pid}

4.2 MAT分析

「Leak Suspects」泄露嫌疑
「Histogram」直方图

显示了各个类的内存占用情况,按照对象的数量或大小进行排序。可以在 Window - Preferences 菜单中设置单位

  • Shallow heap:指的是对象自身所占据的内存,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。

  • Retained heap:指的是该对象GC之后所能回收的总和,包括对象自身所占据的内存,加上仅能够通过该对象引用到的其他对象所占据的内存。

把内存中的对象看成下图中的节点,并且对象和对象之间互相引用。这里有一个特殊的节点GC Roots,这就是reference chain的起点

从obj1入手,上图中蓝色节点代表仅仅只有通过obj1才能直接或间接访问的对象。因为可以通过GC Roots访问,所以左图的obj3不是蓝色节点;而在右图却是蓝色,因为它已经被包含在retained集合内。所以对于左图,obj1的retained size是obj1、obj2、obj4的shallow size总和;右图的retained size是obj1、obj2、obj3、obj4的shallow size总和。obj2的retained size可以通过相同的方式计算

对象引用关系

  • with incoming references 表示的是当前查看的对象,被外部应用
  • with outGoing references 表示的是当前对象,引用了外部对象
「dominator tree」支配树

在此视图中列出了每个对象(Object Instance)与其引用关系的树状结构,同时包含了占用内存的大小和百分比。

「thread overview」线程视图
相关推荐
源码宝几秒前
基于java语言+ Vue+ElementUI+ MySQL8.0.36数字化产科管理平台源码,妇幼信息化整体解决方案
java·源代码·产科电子病历系统源码·医院产科信息管理系统源码·数字化产科管理平台源码
优秀的颜10 分钟前
RabbitMQ(集群相关部署)
开发语言·后端
coisini.cn14 分钟前
基于CentOS Stream 9平台搭建RabbitMQ3.13.4以及开机自启
linux·运维·服务器·rabbitmq·centos stream 9
FREE技术31 分钟前
基于java+springboot+vue实现的畅销图书推荐系统(文末源码+lw+ppt)23-500
java·vue.js·spring boot
ToBeWhatYouWannaBe.32 分钟前
代码随想录-Day49
java·数据结构·算法·leetcode
天若有情67337 分钟前
【澳门风云】用C开发一个模拟一个简单的扑克牌比大小的游戏
c语言·开发语言·游戏
苦藤新鸡37 分钟前
用网络编程完成windows和linux跨平台之间的通信(服务器)
linux·网络·windows
镜花照无眠41 分钟前
python破解字母已知但大小写未知密码
开发语言·python
chenhua100861142 分钟前
artts升级版本后常见的编译错误(定期更新......)
开发语言·javascript
程序无涯海1 小时前
Python爬虫教程第1篇-基础知识
开发语言·爬虫·python·网络爬虫