生产环境,我们的 Flink 作业偶尔会出现 heap OOM,那么当出现这种情况我们会怎么办?通常来说会通过 jmap 命令去将作业的 heap dump 一份文件出来,可是 jmap 导出的文件我们也看不懂啊,那么该怎么分析呢?今天推荐 memory analyzer(mat)这个工具,让他帮助我们来观察程序的内存分布情况吧。

MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式,例如 Sun, HP, SAP 所采用的 HPROF 二进制堆存储文件,以及 IBM 的 PHD 堆存储文件等都能被很好的解析。下面来看看要怎么做呢,也许对你有用。官方文档:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html

造成OutOfMemoryError原因一般有2种:

1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;

2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。

jmap 命令生成堆信息

jmap -dump:live,format=b,file=E:/jmap/heap.dump pid

这样在E盘的jmap文件夹里会有一个map.bin的堆信息文件

这样在E盘的jmap文件夹里会有一个map.bin的堆信息文件

将堆信息导入到mat中分析

生成分析报告

mat可以为我们生成多个报告:

下面来看看生成的这些数据对我们有什么帮助

从上图可以看到它的大部分功能,在饼图上,你会发现转储的大小和数量的类,对象和类加载器。正确的下面,饼图给出了一个印象最大的对象转储。移动你的鼠标一片看到对象中的对象的细节检查在左边。下面的Action标签中:

  • Histogram可以列出内存中的对象,对象的个数以及大小。

  • Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。

  • Top consumers通过图形列出最大的object。

  • Leak Suspects通过MA自动分析泄漏的原因。

Histogram

  • Class Name :类名称,java类名

  • Objects :类的对象的数量,这个对象被创建了多少个

  • Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用

  • Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和

一般来说,Shallow Heap堆中的对象是它的大小和保留内存大小相同的对象是堆内存的数量时,将释放对象被垃圾收集。保留设置一组主要的对象,例如一个特定类的所有对象,或所有对象的一个特定的类装入器装入的类或者只是一群任意对象,是释放的组对象如果所有对象的主要设置变得难以接近的。保留设置包括这些对象以及所有其他对象只能通过这些对象。保留大小是总堆大小中包含的所有对象的保留。摘自eclipse

关于的详细讲解,建议大家查看Shallow heap & Retained heap,这是个很重要的概念。

这儿借助工具提供的regex正则搜索一下我们自己的类,排序后看看哪些相对是占用比较大的。

左边可以看到类的详细使用,比如所属包,父类是谁,所属的类加载器,内存地址,占用大小和回收情况等

这里可以看到上面3个选项,分别生成overview、leak suspects、top components数据,但是这儿生成的不是图表,如果要看图表在(Overview)中的Action标签里点击查看。

这个是Overview中的 Heap Dump Overview视图,从工具栏中点开,这是一个全局的内存占用信息

然后可以点开SystemProperties和Thread Overview进行查看,我这里就不贴了内容比较多。

Dominator Tree

我们可以看到ibatis占了较多内存

Top consumers

这张图展示的是占用内存比较多的对象的分布,下面是具体的一些类和占用。

按等级分布的类使用情况,其实也就是按使用次数查看,java.lang.Class被排在第一

还有一张图是我们比较关心的,那就是按包名看占用,根据包我们知道哪些公共用的到jar或自己的包占用

这样就可以看到包和包中哪些类的占用比较高。

Leak Suspects

从这份报告,看到该图深色区域被怀疑有内存泄漏,可以发现整个heap只有79.7M内存,深色区域就占了62%。所以,MAT通过简单的报告就说明了项目是有可疑代码的,具体点开详情来找到类,

点击鼠标,在List Objects-> with outgoing references下可以查看该类都引用了什么对象,由此查看是否因为其他对象导致的内存问题。

下面继续查看pool的gc ROOT

如下图所示的上下文菜单中选择 Path To GC Roots -> exclude weak references, 过滤掉弱引用,因为在这里弱引用不是引起问题的关键。

进入查看即可,我这儿的代码没有问题,就不用贴了。

The classloader/component "org.apache.catalina.loader.WebappClassLoader @ 0xa34cde8" occupies 19,052,864 (22.80%) bytes. The memory is accumulated in one instance of "java.util.HashMap$Entry[]" loaded by "<system class loader>".Keywords
java.util.HashMap$Entry[]
org.apache.catalina.loader.WebappClassLoader @ 0xa34cde8

这段话是在工具中提示的,他告诉我们WebappClassLoader占了19,052,864 字节的容量,这是tomcat的类加载器,JDK自带的系统类加载器中占用比较多的是HashMap。这个其实比较正常,大家经常用map作为存储容器。

除了在上一页看到的描述外,还有Shortest Paths To the Accumulation Point和Accumulated Objects部分,这里说明了从GC root到聚集点的最短路径,以及完整的reference chain。观察Accumulated Objects部分,java.util.HashMap的retained heap(size)最大,所以明显类实例都聚集在HashMap中了。

来看看Accumulated Objects by Class区域,这里能找到被聚集的对象实例的类名。java.util.HashMap类上头条了,被实例化了5573次,从这儿看出这个程序不存在什么问题,因为这个数字是比较正常的,但是当出问题的时候我们都会看到比较大的自定义类会在前面,而且占用是相当高。

当然,mat这个工具还有很多的用法,这里把我了解的分享给大家,不管如何,最终我们需要得出系统的内存占用,然后对其进行代码或架构,服务器的优化措施!

本文转载自作者:学无止境

原文链接:https://www.cnblogs.com/duanxz/p/6046055.html

MAT分析OOM问题相关推荐

  1. MAT分析OOM dump文件方法

    系列文章目录 第一章 JVM 排查问题命令汇总 第二章 MAT分析OOM dump文件方法 第三章 Java服务使用CAT监控导致OOM的分析 目录 1.明确分析目标及分析指标 2.分析工具对比(jv ...

  2. MAT 分析OOM out of memory模拟OOM Killer

    MAT : 怎么加载/这里边的一些概念 分别对应分析什么问题(泄露,线程,类加载器导致的泄露, 对象空间情况/ domain tree : 最大对象及谁持有它,保持存活的 histogram : 每个 ...

  3. 简述用 MAT 分析 Android 应用OOM

    OOM(OutOfMemoryError) 相信是所有 Android 开发者遇到的最多的 Error,因此找出个中缘由是非常重要. 这里用到的分析工具主要是 Eclipse MAT 插件http:/ ...

  4. Java内存溢出OOM使用Mat分析

    示例 package com.rumenz;import java.util.ArrayList; import java.util.List;public class OutOfMemory {pu ...

  5. 使用Memory Analyzer tool(MAT)分析内存泄漏(二)

    前言 在 使用Memory Analyzer tool(MAT)分析内存泄漏(一)中,我介绍了内存泄漏的前因后果.在本文中,将介绍MAT如何根据heap dump分析泄漏根源.由于测试范例可能过于简单 ...

  6. java模拟内存溢出并分析_模拟内存溢出通过MAT分析

    构建一个简单的Springboot应用,模拟出OOM场景,再导出heap dump文件,通过Mat分析. 搭建简易Springboot,模拟OOM场景 搭建一个简易的springboot工程,在con ...

  7. MAT分析dump文件显示大小比jmap查询结果小

    背景 有朋友向我吐槽,她在一台测试机器上调试,使用jmap查看堆内存占用时,发现年轻代+老年代占用的内存,和dump下堆转储文件使用MAT分析显示的内存不一样,百思不得其解.重现现象如下: jmap显 ...

  8. 使用Memory Analyzer tool(MAT)分析内存泄漏(一)

    使用Memory Analyzer tool(MAT)分析内存泄漏(一) (2010年05月21日) 发表于 Java博客 前言的前言 :本文是自 2005 年 8 月以来,首次在一个月之内发布三篇文 ...

  9. JVM 调优实战--内存溢出的定位和MAT分析

    目录 内存溢出的定位和分析 模拟内存溢出代码 MAT分析 内存溢出的定位和分析 模拟内存溢出代码 添加运行参数: ①-Xms8m:初始堆内存大小为8M: ②-Xmx8m:最大堆内存大小为8M: ③He ...

最新文章

  1. 【力扣网练习题】合并两个有序链表
  2. c语言放空一个数组,C++语言
  3. 说下readyState属性是干嘛的,都有哪几个状态
  4. MAC OS Sierra 10.12.6 下对固态硬盘SSD 开启TRIM功能
  5. 是网关吗_什么是边缘控制器?就是IPC+PLC+网关吗?今天就拆开一个来看看
  6. h5 表单居中_3分钟学会易企秀H5操作(基础篇)
  7. python视频处理加速的库_VPF:适用于 Python 的开源视频处理框架,加速视频任务、提高 GPU 利用率...
  8. 免费开源的中文语音数据集
  9. Unity太空大战游戏-Socket网络通信教学示例
  10. 【Vue】使用vue框架制作一个简单的网页
  11. Nginx-webpy快速搭建反向代理服务及web服务
  12. 鼠标滑轮只能控制声音?
  13. mysql根据字母和数字进行排序
  14. android 浏览器 遥控器 光标,论Android智能电视盒子必装应用之——飞视浏览器
  15. 怎么在视频中截取音频作为手机铃声?
  16. linux文件操作和目录操作,Linux基础操作1——文件和目录
  17. 面试说了这几句话,offer铁定无望!
  18. OpenGL 3.0,等得花儿都谢了
  19. Linux安装chrome的两个方法
  20. 凭借徽商精神,他创办的公司成为国家级电子商务示范企业

热门文章

  1. oracle ora01732,一天一小步_2008.5.02: ora-01732错误
  2. 磁盘与文件系统管理( 认识磁盘,了解磁盘,文件系统的建立与自动挂载)
  3. restful java demo_java通过servlet实现restful接口示例
  4. java模拟滑动事件_java - 以编程方式在Android视图中触发滑动动作事件 - SO中文参考 - www.soinside.com...
  5. php教程链接,php自动给网址加上链接的方法,php网址链接方法_PHP教程
  6. c语言代码表白_用微信表情翻译表白,程序员的小浪漫,赶紧Get起来
  7. python 图片地址_python解码data:image开头的图片地址
  8. python字符复制函数是啥_Python最全的字符和字符串函数,直接复制到IDLE或另存为py可以运行...
  9. linux点亮硬盘灯命令 简书,威联通NAS交流学习:用虚拟机安装荒野无灯大佬的精简win10系统...
  10. asp.net编程网页弹窗显示变量_CODESYS Engineering:面向工程应用编程的工具软件