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),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。

1. 用jmap生成堆信息

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

2. 将堆信息导入到mat中分析

3. 生成分析报告

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

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

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

这儿有个工具可以根据自己的需求分组查找,默认根据class分组,类似我们sql里的group by了~~

这里可以看到上面3个选项,分别生成overview、leak suspects、top components数据,但是这儿生成的不是图表,如果要看图表在

(Overview)中的Action标签里点击查看。

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

Number of objects1,535,626

Number of classes8,459

Number of class loaders74

Number of GC roots2,722

Formathprof

JVM version

Time格林尼治标准时间+0800上午9时20分37秒

Date2014-7-2

Identifier size32-bit

File pathE:\jmap\map.bin

File length108,102,005

Total: 12 entries

然后可以点开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"occupies19,052,864 (22.80%)bytes. The memory is accumulated in one instance of"java.util.HashMap$Entry[]"loaded by"".

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

参考文献:

java 内存分析 工具_Java程序内存分析:使用mat工具分析内存占用 - 王爵的技术博客...相关推荐

  1. 开发Windows Mobile今日插件 -- 内存电量,桌面便笺,桌面记单词(转自hoodlum1980 ( 發發 ) 的技术博客)

    本篇文章讲解的是开发 Windows Mobile 上的今日插件.关于是今日插件,在 PPC 或者 SP SDK 的帮助文档中有相关的章节介绍,在网络上也有一些帖子和资源讲解.在这里简要回顾一下.今日 ...

  2. 技术博客哪家强:CSDN、博客园、简书、开源中国OSChina等博客的详细分析比较

    技术博客哪家强 文章目录 技术博客哪家强 前言 为什么要写博客 技术博客哪家好 几家主要网站的对比 初步结论 参考资料 前言 最近这段时间不是很忙,想干点儿什么有意义的事儿.抽空系统学学Python这 ...

  3. 最值得收藏的java技术博客(Java篇)

    第一个:java_my_life 作者介绍:找不到原作者信息.大概做了翻阅全部是2012年的博客. 博客主要内容:主要内容是关于Java设计模式的一些讲解和学习笔记,在相信对学习设计模式的同学帮助很大 ...

  4. JAVA相关的深度技术博客链接

    JAVA相关的深度技术博客链接 深入聊聊Java 垃圾回收机制[附原理图及调优方法] 说说Java 多线程之悲观锁与乐观锁 深入JAVA 的JVM核心原理解决线上各种故障[附案例] 谈谈你对volat ...

  5. 手把手教你写高质量Android技术博客,画图工具,录像工具,Markdown写法

    前言 作为程序员,写博客是一件很有意义的事情,可以加深自己对技术的理解,可以结交更多的朋友,记录自己的技术轨迹,而且分享可以让更多的人从中受益,独乐乐不如众乐乐嘛. 但是要写好博客也不是件容易的事,一 ...

  6. 一系列国内外顶尖互联网公司的技术博客,晋升程序员必备!

    顶尖公司是大多数程序员都梦寐以求进入的地方,但是技术不行怎么办?学啊!这里收集了一系列国内外顶尖互联网公司的技术博客,好好给自己充充电! 国内技术博客列表 腾讯游戏 DBA 团队 http://ten ...

  7. 泥瓦匠:程序猿为啥要坚持写原创技术博客?

    世界上最廉价的原创是什么?答案希望你从这篇文章中找到. 一.前言 当几年前,接触博客这个词,还是从学长那边.因为他说他学技术,喜欢把遇到的问题,总结到博客上.我就寻思着,学着呗,反正不亏.然后我写了第 ...

  8. 程序员可以选择哪些平台写技术博客?

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 很多时候,别人问我怎么学习Java,怎么可以提升自己 ...

  9. 程序员常用的六大技术博客类

    程序员越来越多,相对应的博客,论坛,社区也乱花渐欲迷人眼,呈现出一个逐渐增长的趋势,以下写的都是一些自己常用的平台,这些平台在百度上面的权重还是很高的,偶尔搜索关键字还能跳出自己写过的博客,于是稍微的 ...

  10. 程序员如何从0到1搭建自己的技术博客

    记得刚毕业参加工作时,每天早上到公司后,都会逛逛博客园,看一下各位大牛前辈写的文章,也许是兴趣使然,当时就特别想搭建一个属于自己的独立的技术博客. 时间就是过的这么快,转眼间这么多年过去了,我的这个梦 ...

最新文章

  1. Leangoo团队敏捷开发实现过程
  2. js 数字递增递减_数字推理满分技巧 !不是干货,请批我!
  3. android浮动文本,android 添加浮动标签在textView最尾端,自动换行
  4. Transition 实现轮播图
  5. Nginx反向代理,负载均衡,redis session共享,keepalived高可用
  6. 鸿蒙系统电视k歌,华为电视怎么k歌?看完两分钟快速开启K歌模式
  7. android 访问权限,Android 使用情况访问权限
  8. 【渝粤教育】广东开放大学 物业服务营销管理 形成性考核 (59)
  9. 一个select元素自定义设计的新思路:appearance: none之后利用符号制造小箭头
  10. 转——深度学习之BN算法(Batch Normailization)
  11. 韩国f4计算机考试在哪报名,2020年F4签证资格考试报名方式及考试日程,错过还要再等3个月!...
  12. Hibernate双向一对一对象关系模型映射
  13. sleep、wait、yield、join区别
  14. 在moss上自己总结了点小经验。。高手可以飘过
  15. Java连接数据库的步骤
  16. Xposed插件 - Android一键脱壳工具
  17. 北京地铁线路色值颜色
  18. 智能车辆纵向速度跟踪与控制方法研究
  19. 购物车里看中国:淘宝发布18年18件“时代宝贝”
  20. 【BZOJ30472125】Freda的传呼机

热门文章

  1. 时钟周期,机器周期(cpu周期),指令周期,存储周期,总线周期
  2. Python面积计算器源代码
  3. win10 启动后无法正常显示桌面/黑屏
  4. 狗狗有关的知识tips
  5. CUDA+Pycharm-gpu版本+Anaconda安装
  6. 2021下半年河南郑州普通话测试报名入口
  7. 系统设计之路:如何设计一个URL短链服务
  8. 矩阵微分常用公式整理
  9. 2021年与 Linux 有关的几件大事
  10. 中金易云:为出版社找到下一本《解忧杂货店》