最近,线上生产系统突然频繁的 JVM 内存报警!但本系统近期内并没有上线改动!

为了能查清内存报警的原因,使用 Eclipse Memory Analyzer tool(MAT)对 JVM Dump 文件进行了分析!

1. 生成 dump 文件

用 jmap 生产 dump 文件

jmap -dump:format=b,file=HeapDump.bin <pid>

2. MAT 安装与介绍

下载地址:http://www.eclipse.org/mat/downloads.php

通过 MAT 打开 dump 出来的内存文件,打开后如下图:

 

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

Histogram 如下图:

Objects:类的对象的数量。
Shallow size:就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。
Retained size:是该对象自己的 shallow size,加上从该对象能直接或间接访问到对象的 shallow size 之和。换句话说,retained size 是该对象被 GC 之后所能回收到内存的总和。

我们发现 ConcurrentHashMap 类的对象占用了很多空间。

Leak Suspects 如下图:

从那个饼图,该图深色区域被怀疑有内存泄漏,可以发现整个 heap 2G 内存,深色区域就占了 98%。后面的描述,说明内存被一个实例占用了大量内存,并指出 system class loader 加载的"java.util.concurrent.concurrentHashMap$Segmen[]"实例的内存中聚集(消耗空间),并建议用关键字"java.util.concurrent.concurrentHashMap$Segmen[]"进行检查。所以,MAT 通过简单的报告就说明了问题所在。

Dominator Tree 如下图:>

我们逐层打开 concurrentHashMap 的内存结构,发现 Key 非常多,并且最底层的 String 长度很大!

幸运的是该系统的下游也是我们负责的系统,猜测 concurrentHashMap 应该是 RPC 调用返回回值待处理的内存存储,正常情况这个 String 的长度不很大。仔细查看, String 里包含了多了很多详细的异常描述信息,之前是没有的。

排查下游系统代码,发现在返回异常时,与之前异常抛出有所不同:

try {
} catch(Exception e) {throw e;
}...try {
} catch(Exception e) {throw new Exception("xxxx", e);
}// 返回伪代码
response(e.getMessage);

就是有这些许的不同,我们看下源代码:

public Throwable(String message, Throwable cause) {fillInStackTrace();detailMessage = message;this.cause = cause;
}public Throwable(Throwable cause) {fillInStackTrace();detailMessage = (cause==null ? null : cause.toString());this.cause = cause;
}public String getMessage() {return detailMessage;
}

当没有 message,message = cause.toString(),所以就造成了返回大量不必要的异常信息,从而影响了上游系统!

参考:

http://tivan.iteye.com/blog/1487855

—————————— 本文同步发布于 ZHANGSR 我的个人博客  ——————————

转载于:https://blog.51cto.com/sauron/1614362

一次使用 Eclipse Memory Analyzer 分析 Tomcat 内存溢出相关推荐

  1. 使用Eclipse Memory Analyzer分析Tomcat内存溢出

    本文语言逻辑转载:http://tivan.iteye.com/blog/1487855 实际分析来源于自己的实际项目. 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryEr ...

  2. 一次使用Eclipse Memory Analyzer分析weblogic内存溢出

    前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题.我们需要找造成OutOfMemoryError原因.一般有两种情况 ...

  3. 使用Eclipse Memory Analyzer对Tomcat进行内存分析

    测试环境 Java : JDK1.6 Tomcat: Tomcat 5.5 Eclipse Memory Analyzer:EMA 1.2.1(直接去Eclipse下载,无需安装哈) 获得Heap D ...

  4. 使用memory analyzer分析堆栈内存优化poi excel导入方法

    最近服务器崩了一次,主管发现是内存被大量占用,分析heap dump以后发现是excel导入相关的对象,占用了整整一个g,所以让我去优化一下.这个问题之前从来没出现过,虽然后来发现导入的excel不止 ...

  5. Eclipse Memory Analyzer分析内存使用总结

    前言 内存泄露和内存溢出的区别:内存泄露从老年代的增长情况看是缓慢上升的, 最终达到老年代上限才会导致溢出,有些内存泄露可能需要很长的时间发生, 所以说内存泄露更隐蔽, 不像内存溢出那样容易暴露(内存 ...

  6. 内存映像分析工具Eclipse Memory Analyzer

    1. Eclipse Memory Analyzer安装 Help ->Eclipse Marketplace,搜索Memory,点击install,->confirm->同意证书内 ...

  7. 使用 Eclipse Memory Analyzer 进行堆转储文件分析

    概述 对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录 ...

  8. mat分析dump分析_使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一)

    来源:  https://sourl.cn/ggYpYX 前言 Eclipse Memory Analyzer Tool(MAT)是一个强大的基于Eclipse的内存分析工具,可以帮助我们找到内存泄露 ...

  9. jvm性能分析工具之-- Eclipse Memory Analyzer tool(MAT)

    性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(一) 前言 性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(一)中介绍了 ...

最新文章

  1. java orm 工具_GitHub - donnie4w/jdao: jdao是一个java的轻量级orm工具包
  2. APM - Prometheus监控系统初探
  3. virtual、override-蝌蚪和青蛙-C#多态
  4. java实现extended smtp_java实现发送邮件(SMTP)
  5. php和nginx如何,php和nginx如何交互
  6. 机器学习面试-其他重要算法
  7. 用python做一个车牌识别_python利用百度云接口实现车牌识别
  8. Exception in thread “main“ org.apache.spark.sql.catalyst.parser.ParseException: extraneous input ‘$
  9. 心脏线绘制python_心脏线怎么画?
  10. AI深度、机器学习数据集资源汇总
  11. ViewFlipper和ViewPager
  12. 金蝶kis数据库说明(转载)
  13. 蓝桥杯-第九届决赛——采油
  14. Java忽略返回字段
  15. 生信数据库ID大总结-想踏入生信大门的你值得拥有
  16. 如何卸载手机系统应用
  17. Go语言之值传递与引用传递
  18. 海蜘蛛软路由 linux,海蜘蛛网络科技官方网站 :: 做最好的中文软路由 :: 软件路由器 :: 软路由 :: 软件路由 :: RouterOs...
  19. 腾中重工洽购悍马揭秘:低调富豪李炎浮现
  20. beanstalk队列服务for php

热门文章

  1. Oracle 9i DBA Fundamentals I 学习笔记(三)
  2. Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)
  3. 简单的路由协议分析和配置
  4. php播放音乐视频,html5停止(暂停)当前播放的音频或视频的方法pause()
  5. 135编辑器 html,135编辑器,微信图文编辑器,微信图文美化编辑器,格式多方便的图文编辑-...
  6. Python爬无止境,获得王者荣耀全部高清皮肤
  7. Python图像处理,替代PS做好效果图!
  8. 简单介绍nginx 变量使用
  9. html页面在ie上出现404怎么解决,如何解决自定义404页面在IE等浏览器中无法显示问题...
  10. 蓝桥杯知识点归纳-java-API