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 ...
随机推荐
- Spring源码解析三:IOC容器的依赖注入
一般情况下,依赖注入的过程是发生在用户第一次向容器索要Bean是触发的,而触发依赖注入的地方就是BeanFactory的getBean方法. 这里以DefaultListableBeanFactory ...
- HTML5 File接口(在web页面上使用文件)
File接口提供了与文件相关的信息,并且运行JavaScript在web页面上去访问文件中的内容. File对象来自于用户使用input标签选择文件返回的FileList对象,来自于拖放操作的Data ...
- Hibernate框架单向多对一关联映射关系
建立多对一的单向关联关系 Emp.java private Integer empNo //员工编号 private String empName / ...
- Scalatra--Introduction And Quick start
Introduction Scalatra是一款轻易级Scala web框架,通过Scalatra可以很轻易创建web Application,由Linkedln开源并遵循了Ruby Web框架的Si ...
- c#基础语句——循环语句(for、while、foreach)
循环类型:for.while.foreach 循环四要素:初始条件-->循环条件-->循环体-->状态改变 1.for 格式: for(初始条件:循环条件:状态改变) {循环体(br ...
- HTML 5入门知识(五)
本地存储Web Storage 使用HTML 5的Web Storage功能,可以在客户端存储更多的数据,而且可以实现数据在多个页面中共享甚至是同步. cookie存储数据的不足 cookie可用于在 ...
- NDK 开发(Android.mk配置)
在我写这篇文章的时候,Android Studio已经是2.3版本了,已经集成CMake 编译工具, 用户只需在 新建项目的时候,添加选项(Include C++ support),Andr ...
- Jquery的学习:基础核心!
一.什么是 jQuery jQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一整套定义好的方法.它的作者是John Resig,于2006年创建的一个开源项目,随着 ...
- gulp自动化压缩合并、加版本号解决方案
虽然网上有很多的 gulp 构建文章,但是很多都已经随着 gulp 插件的更新无法运行了.因此,我写了这个比较简单的构建方案. 如果还不熟悉 gulp 的插件,可以阅读上一篇文章:精通gulp常用插件 ...
- [HDU]1016 DFS入门题
题目的意思就是在1到n的所有序列之间,找出所有相邻的数相加是素数的序列.Ps:题目是环,所以头和尾也要算哦~ 典型的dfs,然后剪枝. 这题目有意思的就是用java跑回在tle的边缘,第一次提交就tl ...