MAT(Memory Analyzer Tool)使用心得
起因:最近在跟踪产品的性能问题,期间主要问题体现在JVM的内存回收问题,使用MAT工具进行JVM内存分析(也可对android 的应用内存分析)
问题描述:
1、部分后端服务在运行一段时间后会突然年老代会变为100%
2、部分后端服务定期出现年轻代GC情况,耗时超过2S
问题1解决步骤:
利用jmap指令(jmap -dump:format=b,file=文件名 PID)生成内存快照文件。文件名支持相对路径和绝对路径,PID指Java应用的进程ID,可通过JPS指令获取,在有些时候该指令无法直接生成内存快照,需要额外补充-f,原因会在稍后的文章中说明。
在官网下载MAT独立包(推荐64位,并修改MemoryAnalyzer.ini文件中的-Xmx,确保其值大于你的内存快照文件大小,否则MAT打开内存文件会报内存溢出),打开之前保存的内存快照文件
打开后,直接选择leak suspects选项(该选项表示MAT会自动帮我们分析内存泄漏最可能的类),分析完后类比下图(图片来自网络)
一般来说,该报告会告诉我们最可能泄露的类和相关实例,我们点进打开后,对Retained Heap最大的实例再点击选择outGoing references(当前对象,引用的外部对象),即可查看该实例中引用了哪些对象,一直没释放,从而导致该实例占了不少内存
根据步骤4基本就可以确认,究竟是哪些对象实例强引用未能释放,从而导致内存持续上涨直至频繁FGC,这时候就可以拉上开发的童鞋根据代码进行分析
回到问题的原点,这次的问题发生的原因是:多例模式下,大量的对象被加载到OSGI的核心容器中,从而导致大并发情况下,导致内存出现泄漏,最后内存溢出
问题2解决步骤:
分析步骤与问题1并无偏差,但奇怪的现象是生成的报告中任何对象的实例的大小都很小,且总和与实际的内存文件相差甚远
MAT默认是只分析reachable对象实例,所以在"Preferences=>Memory Analyzer"中勾选"Keep Unreachable Objects",删除索引文件Dump同路径下的所有".index",即可看到所有的对象,再根据上述步骤4进行分析
此时发现某个对象实例,其某个属性List无比庞大(size>10000)
后经与研发同事分析得知,某些查询动作会入库,从而导致日积月累的情况下,查询时就会创建一个额外的对象,引发频繁的young gc,甚至full gc
问题反思:
版本测试时,除了常规的功能测试外,还要对核心业务进行性能测试,根据时间进度可适当切割,但不能缺失
场景测试时,除了常规的场景测试外,还需考虑当前的数据库量级,若当前表量级较大,业务模块中的sql语句是否有做limit等限制
生产环境上应对应用做相关监控,除了日常的服务器本身性能监控外,还需要对应用本身的各项指标监控,例如:GC次数、GC耗时甚至young、s0、s1、pem、old等不同年代的监控。根据日常的监控图表来判断当前服务是否正常
一般来说,young gc的次数要大于old gc和full gc,且耗时是毫秒级。不然,则有可能:young年代设置过小,应用创建了过大的对象,存在大量强应用的对象实例等
参考资料:
https://my.oschina.net/flashsword/blog/265442
http://www.blogjava.net/rosen/archive/2010/06/13/323522.html
MAT(Memory Analyzer Tool)使用心得的更多相关文章
- 使用MAT(Memory Analyzer Tool)工具分析dump文件--转
原文地址:http://gao-xianglong.iteye.com/blog/2173140?utm_source=tuicool&utm_medium=referral 前言 生产环境中 ...
- MAT(Memory Analyzer Tool)工具入门介绍
1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...
- MAT(Memory Analyzer Tool)工具入门介绍(转)
1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...
- MAT Memory Analyzer Tool 插件安装(图解)
MAT Memory Analyzer Tool 插件安装(图解) 原文地址 @author YHC 前段时间做了一个项目,Exception in thread "main" j ...
- 【转】MAT(Memory Analyzer Tool)工具入门介绍
1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...
- 内存分析工具-MAT(Memory Analyzer Tool)
内存分析工具-MAT(Memory Analyzer Tool) 首先查看如下代码,main函数中有一个成员变量map,map里被循环放入对象Hanson,hanson持有姓名和age还有friend ...
- Android 内存分析工具 MAT(Memory Analyzer Tool)
如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...
- 转载:MAT Memory Analyzer Tool使用示例
地址:http://blog.csdn.net/yanghongchang_/article/details/7711911 以下是一个会导致java.lang.OutOfMemoryError: J ...
- MAT(Memory Analyzer Tool)内存分析工具的使用
开发.应用中老是会遇到OutOfMemory异常,而且常常是过一段时间内存才被吃光,这里可以利用java heap dump出jvm内存镜像,然后再对其进行分析来查找问题. 平常利用jmap -dum ...
- [性能测试]:内存泄漏以及MAT(Memory Analyzer Tool)工具使用分析
一.今天在查看服务器时候,发现内存使用率直接就到99%了, 二.用ps -uaxw查看一下,每个占用内存较多的进程情况: 三,挑出可疑的进程,生成dump文件: jmap -dump:format=b ...
随机推荐
- 每天一个Linux命令(12)--more命令
more命令,功能类似cat, cat 命令是这个文件的内容从上到下显示在屏幕上,more会以一页一页的显示方便使用者主页阅读,而最基本的指令就是按空格键就往下一页显示,按B键就会往回一页显示,而且 ...
- Git commit message和工作流规范
目的 统一团队Git commit日志标准,便于后续代码review,版本发布以及日志自动化生成等等. 统一团队的Git工作流,包括分支使用.tag规范.issue等 Git commit日志参考案例 ...
- synchronized和lock比对
前言:在上面的博客说了synchronized的一些用法,下面我们再来看看lock,这个出现频率也是非常高的一个. 1:获取Lock锁的几种方式 前面说了synchronized有锁对象和锁类对象,当 ...
- C#知识整理笔记
这里简单介绍了一些常用的属性,以及一些术语的解释和举例说明,不太全面,希望读者多多补充. 1.重载:函数名相同,参数的个数或参数类型不同; public void MyDog(string s); p ...
- java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4
概述 信息安全基本概念: DES(Data Encryption Standard,数据加密标准) 3DES(Triple DES,三重数据加密算法(TDEA,Triple Data Encrypti ...
- Azure Messaging-ServiceBus Messaging消息队列技术系列5-重复消息:at-least-once at-most-once
上篇博客中,我们用实际的业务场景和代码示例了Azure Messaging-ServiceBus Messaging对复杂对象消息的支持和消息的持久化: Azure Messaging-Service ...
- RequireJS基础知识
RequireJS解决代码依赖问题,异步加载js,避免页面失去相应 RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤.可以用它来加速.优化代 ...
- dreamweaver破解版下载地址
dreamweaver CC 2015可以在可视化环境中设计的你网页,非常方便高效完成网页设计.Adobe Dreamweaver CC 2015支持CSS编辑器.和jQuery库代码自动完成功能等等 ...
- JAVA-Servlet-ServletConfig 与 ServletContext 的区别
什么是ServletConfig? Servlet容器初始化一个servlet对象时,会为这个servlet对象创建一个servletConfig对象.在servletConfig对象中包含了serv ...
- 【Python系列】Python自动发邮件脚本-html邮件内容
缘起 这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入率再调低,估计就要花钱买主机了,想想也就算了,先发一个月, ...