排查OOM(MAT-VisualVM)

①VM参数准备:

设置启动参数(设置堆大小、内存溢出时往指定目录生成dump文件)

dump文件:文件是内存转储文件,也称为内存快照文件(内存镜像)

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=E:\OnePlus\dump

-Xmx1024m -Xms1024m

②编写代码并启动服务

③开启监控

a.打开jdk自带工具,JVisualVM

image-20210528192339675

 

 b.使用jdk自带jstat命令

在jdk\bin目录下输入如下命令

jstat -gc -t -h8 6084 1000

//-gc表示打印gc信息

//-t表示打印程序总运行时间

//-h8表示每输出八行打印一次表头

//6084为pid

//1000 为一秒打印一行信息

③Postman调用接口

③运行并观测现象

使用JVisualVM观测Cup和堆内存

 观测到内存和cpu猛增

 

 观测到伊甸园区和老年代已经被塞满

①观测到fullGC从一开始的2次已经猛增到43次,并且还在持续增长

②算一下FullGC总用时和程序总用时的比值,(83.933-58.685)/(652.1-626.2)=0.974 =97%,FullGC会造成STW导致应用挂起不可用

 在指定目录生成了dump文件

④结论

1.控制台打印OOM;

2.在指定文件夹生成dump文件;

3.超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常 java.lang.OutOfMemoryError: GC overhead limit exceeded

⑤分析Dump文件

使用工具MAT

1.加载生成的dump文件

在这里插入图片描述

2.选择生成泄漏报告

查看mat泄漏报告

可从mat工具的提示中看到List里包裹的User占比百分之九十三

3.分析问题

字段说明:

浅堆(Shallow Heap) 表示对象结构本身所占内存的大小,不包含引用的对象,单位 bytes。 深堆(Retained Heap) 表示这个对象以及 仅被 它所直接或间接引用的对象所占的内存之和,单位 bytes,表示一个对象被GC回收后可以真实释放的内存大小。

outgoing references :表示该对象的出节点(被该对象引用的对象)。

incoming references :表示该对象的入节点(引用到该对象的对象)。

4.定位出错位置

通过使用mat工具的线程信息(下图中的黄色小齿轮)

即可看到UserController类oom方法中List里包裹了太多的User

实际的线上环境可以通过对比不同时期的dump文件从而分析内存泄漏等问题

同时搭配多种监控工具观测如arthas

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用jmap工具可以对Java应用程序进行内存分析,帮助排查OOM问题。以下是使用jmap工具进行OOM排查的步骤: 1. 确认OOM错误:通过查看应用程序的日志或系统日志,确认是否发生了OOM错误。 2. 获取Java进程ID:使用`jps`命令获取Java进程的ID,例如:`jps -l`。 3. 使用jmap生成堆转储文件:运行以下命令生成堆转储文件(heap dump file): ``` jmap -dump:format=b,file=heapdump.bin <pid> ``` 其中,`<pid>`是Java进程的ID。 4. 分析堆转储文件:使用MAT(Memory Analyzer Tool)等内存分析工具来打开生成的堆转储文件。MAT是一款常用的Java堆内存分析工具,可以下载安装并打开生成的堆转储文件。 5. 查找内存泄漏:在MAT中,可以通过执行一系列分析操作来查找可能的内存泄漏。其中一种常用的分析是通过查看堆转储文件中的对象引用关系来定位可能导致内存泄漏的对象。 6. 分析对象占用内存情况:在MAT中,可以查看对象占用内存的情况,包括对象数量、大小和引用关系等信息。这有助于确定哪些对象占用了大量内存,可能导致OOM。 7. 优化代码和资源释放:根据分析结果,优化代码以避免内存泄漏或者减少内存占用。确保及时释放不再需要的对象和资源,使用合适的数据结构等。 请注意,使用jmap生成堆转储文件会在运行期间暂停Java进程一段时间,请在生产环境中谨慎使用。此外,内存分析工具的使用需要一定的经验和技巧,对于复杂的问题,建议咨询专业的开发人员来进行排查和解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值