起因:最近在跟踪产品的性能问题,期间主要问题体现在JVM的内存回收问题,使用MAT工具进行JVM内存分析(也可对android 的应用内存分析)

问题描述

  • 1、部分后端服务在运行一段时间后会突然年老代会变为100%

  • 2、部分后端服务定期出现年轻代GC情况,耗时超过2S

问题1解决步骤

  1. 利用jmap指令(jmap -dump:format=b,file=文件名 PID)生成内存快照文件。文件名支持相对路径和绝对路径,PID指Java应用的进程ID,可通过JPS指令获取,在有些时候该指令无法直接生成内存快照,需要额外补充-f,原因会在稍后的文章中说明。

  2. 在官网下载MAT独立包(推荐64位,并修改MemoryAnalyzer.ini文件中的-Xmx,确保其值大于你的内存快照文件大小,否则MAT打开内存文件会报内存溢出),打开之前保存的内存快照文件

  3. 打开后,直接选择leak suspects选项(该选项表示MAT会自动帮我们分析内存泄漏最可能的类),分析完后类比下图(图片来自网络)

  4. 一般来说,该报告会告诉我们最可能泄露的类和相关实例,我们点进打开后,对Retained Heap最大的实例再点击选择outGoing references(当前对象,引用的外部对象),即可查看该实例中引用了哪些对象,一直没释放,从而导致该实例占了不少内存

  5. 根据步骤4基本就可以确认,究竟是哪些对象实例强引用未能释放,从而导致内存持续上涨直至频繁FGC,这时候就可以拉上开发的童鞋根据代码进行分析

  6. 回到问题的原点,这次的问题发生的原因是:多例模式下,大量的对象被加载到OSGI的核心容器中,从而导致大并发情况下,导致内存出现泄漏,最后内存溢出

问题2解决步骤

  1. 分析步骤与问题1并无偏差,但奇怪的现象是生成的报告中任何对象的实例的大小都很小,且总和与实际的内存文件相差甚远

  2. MAT默认是只分析reachable对象实例,所以在"Preferences=>Memory Analyzer"中勾选"Keep Unreachable Objects",删除索引文件Dump同路径下的所有".index",即可看到所有的对象,再根据上述步骤4进行分析

  3. 此时发现某个对象实例,其某个属性List无比庞大(size>10000)

  4. 后经与研发同事分析得知,某些查询动作会入库,从而导致日积月累的情况下,查询时就会创建一个额外的对象,引发频繁的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)使用心得的更多相关文章

  1. 使用MAT(Memory Analyzer Tool)工具分析dump文件--转

    原文地址:http://gao-xianglong.iteye.com/blog/2173140?utm_source=tuicool&utm_medium=referral 前言 生产环境中 ...

  2. MAT(Memory Analyzer Tool)工具入门介绍

    1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...

  3. MAT(Memory Analyzer Tool)工具入门介绍(转)

    1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...

  4. MAT Memory Analyzer Tool 插件安装(图解)

    MAT Memory Analyzer Tool 插件安装(图解) 原文地址 @author YHC 前段时间做了一个项目,Exception in thread "main" j ...

  5. 【转】MAT(Memory Analyzer Tool)工具入门介绍

    1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...

  6. 内存分析工具-MAT(Memory Analyzer Tool)

    内存分析工具-MAT(Memory Analyzer Tool) 首先查看如下代码,main函数中有一个成员变量map,map里被循环放入对象Hanson,hanson持有姓名和age还有friend ...

  7. Android 内存分析工具 MAT(Memory Analyzer Tool)

    如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...

  8. 转载:MAT Memory Analyzer Tool使用示例

    地址:http://blog.csdn.net/yanghongchang_/article/details/7711911 以下是一个会导致java.lang.OutOfMemoryError: J ...

  9. MAT(Memory Analyzer Tool)内存分析工具的使用

    开发.应用中老是会遇到OutOfMemory异常,而且常常是过一段时间内存才被吃光,这里可以利用java heap dump出jvm内存镜像,然后再对其进行分析来查找问题. 平常利用jmap -dum ...

  10. [性能测试]:内存泄漏以及MAT(Memory Analyzer Tool)工具使用分析

    一.今天在查看服务器时候,发现内存使用率直接就到99%了, 二.用ps -uaxw查看一下,每个占用内存较多的进程情况: 三,挑出可疑的进程,生成dump文件: jmap -dump:format=b ...

随机推荐

  1. 简洁美观的Java博客系统Tale开源了,让每一个有故事的人更好的表达想法

    Tale Tale的英文含义为故事,我相信每个坚持写Blog的人都是有故事的:中文你叫它 塌了 也无所谓 . Tale 使用了轻量级mvc框架 Blade 开发,默认主题使用了漂亮的 pinghsu, ...

  2. Angular.js!(附:聊聊非原生框架项目)

    最近,为了项目接触了一个很火的前端框架Angular.js,下面就Angular做一个简介吧(大牛请绕步,只针对没有接触过angular的人). Angular.js是一款精简的前端框架,如果要追溯它 ...

  3. 学习ASP.NET MVC(十)——排序

    1 按照价格对书籍进行排序 下面我们通过一个简单的例子学习如何对书籍信息按照价格进行排序. 首先,我们在Controllers\BookController.cs文件中的SearchIndex方法添加 ...

  4. 【Java基础】String StringBuffer StringBuilder

    String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...

  5. angular : direative : scope | 指令scope里的符号@,=

    先看看以下的代码 <body ng-app="app" ng-controller="ctrl"> <dir myname="nam ...

  6. VUE2.0实现购物车和地址选配功能学习第六节

    第六节 地址列表过滤和展开所有的地址 html:<li v-for="(item,index) in filterAddress">js: new Vue({ el:' ...

  7. C#中函数的功能和类型

    函数  就是方法是独立完成某项功能的一个个体 函数的的三个好处:1.提高代码的重用性.2.提高功能开发的效率,3.提高代码的可维护性(主要功能). 函数也分为     固定功能函数(这类函数具有可封闭 ...

  8. Git如何检出指定目录或文件

    系统版本:Window 10,Git 版本:2.7.1 对于大型 Git 仓库,每次执行 Git 命令,都需要经过漫长的等待,特别是要经常执行的 git status 命令.下面是一个例子... 从 ...

  9. 写lua时需要注意的地方

    条件语句判断时,只有false和nil会导致判断为假,其他的任何值都为真. Lua 的字符串与编码无关: 它不关心字符串中具体内容. 标准 Lua 使用 64 位整数和双精度(64 位)浮点数, 但你 ...

  10. 对volatile关键字的理解

    本文是基于对 http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 这篇文档的理解 volatile 用volatile修饰的 ...