概述

一个大型的Java项目也许从开发到测试结束并未发现一些大的问题,但是在生产环境中还是会出现一些非常棘手的问题,如内存泄漏,遇到这样的问题对于一个经验尚浅的开发人员来说难度非常大,好的一点是JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。

接下来介绍的一个工具是 Eclipse Memory Analyzer 它被认为是一个“傻瓜式“的堆转储文件分析工具,通过该工具可以生成一个专业的分析报告,从而帮我们准确的定位到问题的所在位置。

安装 Eclipse Memory Analyzer

这里介绍三种安装方式

方式一:直接从官网下载程序包 http://www.eclipse.org/mat/downloads.php,解压可直接使用。

方式二:在Eclipse中通过 Help -> Install New Software,输入地址 http://download.eclipse.org/mat/1.6.1/update-site/ 进行安装

方式三(推荐):Eclipse 的可插拔式插件安装方式,这里不在介绍具体的插件安装步骤,安装后重启Eclipse,这样就可以在Eclipse中直接打开Heap Dump文件了。

配置环境参数

安装完成之后,为了更有效率的使用 Eclipse Memory Analyzer ,我们还需要做一些配置工作。因为通常而言,分析一个堆转储文件需要消耗很多的堆空间,为了保证分析的效率和性能,在有条件的情况下,我们会建议分配给 Eclipse Memory Analyzer 尽可能多的内存资源。你可以采用如下两种方式来分配内存更多的内存资源给 Eclipse Memory Analyzer 。

方式一:修改启动参数 MemoryAnalyzer.exe -vmargs -Xmx4g

方式二:编辑文件 MemoryAnalyzer.ini,在里面添加类似信息 -vmargs – Xmx4g。

如何获得堆转储文件

方式一:在Eclipse中配置JVM启动参数 -XX:+HeapDumpOnOutOfMemoryError

方式二:通过JDK自带的工具JMap,JConsole来获得一个堆转储文件

这里我们使用方式一来获得

结合案例分析

1. 编写一个内存溢出的例子然后获得堆转储文件

import java.util.ArrayList;

import java.util.List;

public class HeapOOM {

static class OOMObject{}

public static void main(String[] args) {

List ooms = new ArrayList();

while (true) {

ooms.add(new OOMObject());

}

}

}

2. VM参数配置如下

3. 运行示例代码即可生成如下文件然后双击打开

分析报告

内存占用整体概览

直接点击饼图下方的 Reports->Leak Suspects 链接来生成报告。

查看报告一(内存消耗的整体状况)

从图上我们可以清晰地看到一个可疑对象消耗了系统近 98% 的内存。再往下看饼图下方文字简短描述了大量的内存是由属于Object实例的对象所消耗的,system class loader 负责加载这个对象。也许从这里还不能找出内存泄漏的具体原因,接着往下看。

查看报告二(分析问题的所在)

首先我们简单回顾下 JAVA 的内存回收机制,内存空间中垃圾回收的工作由垃圾回收器 (Garbage Collector,GC) 完成的,它的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。

在垃圾回收机制中有一组元素被称为根元素集合,它们是一组被虚拟机直接引用的对象,比如,正在运行的线程对象,系统调用栈里面的对象以及被 system class loader 所加载的那些对象。堆空间中的每个对象都是由一个根元素为起点被层层调用的。因此,一个对象还被某一个存活的根元素所引用,就会被认为是存活对象,不能被回收,进行内存释放。因此,我们可以通过分析一个对象到根元素的引用路径来分析为什么该对象不能被顺利回收。如果说一个对象已经不被任何程序逻辑所需要但是还存在被根元素引用的情况,我们可以说这里存在内存泄露。

点击“Details ”链接

查看从根元素到内存消耗聚集点的最短路径

我们可以很清楚的看到整个引用链,内存聚集点是在 Java main 线程创建的一个集合元素上。接下来,我们再继续看看,这个对象集合里到底存放了什么,为什么会消耗掉如此多的内存。

注:

Shallow Heap 为对象自身占用的内存大小,不包括它引用的对象。

Retained Heap 为当前对象大小 + 当前对象可直接或间接引用到的对象的大小总和,如:

A对象的 Retained Heap = A对象的 Shallow Heap + C对象的 Shallow Heap 这里不包含 D 对象的 Shallow Heap因为 D对象被Root根对象所引用。

B对象的 Retained Heap = B对象的 Shallow Heap。

查看内存消耗聚集对象信息

在这张图上,我们可以清楚的看到,这个对象集合中保存了大量 OOMObject 对象的引用,就是它导致的内存泄露。

至此,我们已经拥有了足够的信息去寻找泄露点。

java分析内存泄露工具_Eclipse Memory Analyzer(Java内存泄漏分析工具)相关推荐

  1. Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用

    详细介绍了Java内存分析工具MAT(Memory Analyzer Tool)的常见使用方法,MAT可以帮助Java程序员快速进行内存分析,定位问题. MAT(Memory Analyzer Too ...

  2. 【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 )

    文章目录 一. 内存中最大的对象 二. 查看每个类的对象实例的个数 三. 查看对象的引用与被引用 四. 查看对象到 GC Roots 的最短距离 1. 选择 Merge Shortest Paths ...

  3. Eclipse Memory Analyzer以及内存泄露的原因

    Eclipse Memory Analyzer是一个非常棒的堆内存分析工具,是JDK自带的堆分析工具jhat的一个非常好的替代品,能够快速地定位Java内存泄露的原因.       可能有的同学会问, ...

  4. python 单例模式内存泄露_彻底搞懂Java内存泄露

    之前一直在简书写作,第一次发布到SF上来,也是第一次使用SF,后面会尽量同步到SF,更多文章请关注: 简书 编程之乐 转载请注明出处:谢谢! Java内存回收方式 Java判断对象是否可以回收使用的而 ...

  5. 什么是内存溢出与内存泄露,几种常见导致内存泄露的写法

    最近朋友推荐了一篇关于内存溢出与内存泄漏的文章,感觉写的还不错,于是便在网上搜索了一番,对这块进行了加固,发现自己之前写的代码也存在一些内存泄漏的风险,所以弄懂内存泄漏与内存溢出是很有利于我们提高代码 ...

  6. python会不会内存泄露_记一次python 内存泄漏问题及解决过程 python 嵌套读取文件 内存泄露...

    如何解决Python2的内存泄漏问题 python本身不会造成内存泄露,如果用的C/C++写的模块(包),如果处理不好,可能会造成内存泄露,但是也是C/C++的模块造成的 欢迎来到四十五资源网,pyt ...

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

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

  8. Profiler分析内存抖动,Memory Analyzer(mat)分析内存泄漏(不懂砍我)

    前言: 最近在系统性的温习了一遍android性能优化.写博客是学习也是记录,希望在记录的同时也能帮助其他同学.最近我觉得我想出一个不懂系列."不懂揍我","不懂砍我&q ...

  9. videocapture.read()解决内存泄露_只需4个步骤,分析解决在生产环境下JVM内存泄露问题...

    作者:未完成交响曲 发现异常 首先通过我们内部搭建的日志平台发现我们线上环境一个java应用有大量的http接口请求超时,登录linux服务器查看网络环境没有问题,判断是应用自身运行异常,重启应用后发 ...

最新文章

  1. 中文发音关系频谱的猜想
  2. 十大经典数据挖掘算法:SVM
  3. 微软Visual Studio 2019版本16.3 正式发布,支持 .NET Core 3.0
  4. linux 终端必须退出 history才会记录吗,Linux随笔 - linux 多个会话同时执行命令后history记录不全的解决方案【转载】...
  5. typeof和instanceof
  6. Python机器学习:梯度下降法006随机梯度下降法
  7. Verilog实现交通灯(数电课设)-----新--及对于状态机的理解
  8. centos7 crontab 定时执行python任务不执行的原因及解决办法
  9. 68、secureCRT,vim中输入中文
  10. MotorSolve(电机设计软件)v5.1绿色中文版
  11. 爱奇艺落子IP源头 全产业链开放协同助攻原创内容
  12. nuxt项目当中出现The client-side rendered virtual DOM tree is not matching server-rendered content
  13. 美国计算机加音乐专业,美国音乐博士解析
  14. 利用FFT计算非平稳随机信号的WVD分布
  15. Linux可加载内核模块(LKM)(转载)
  16. Docker images导出和导入
  17. 晋城一中oj 议员秘密
  18. 简历上敢写自己熟练运用Spring,那这些问题你清楚嘛?
  19. Imblearn package study(不平衡数据处理之过采样、下采样、综合采样)
  20. 网络安全从业人员能力图谱

热门文章

  1. 如何在linux服务器下载文件夹,linux服务器怎么下载文件到本地
  2. nid java_java – jstack输出缺少tid和nid信息
  3. [Nucleo-F411RE] 第1篇---新建一个工程
  4. 信数金服决策引擎分享(一):来聊聊冠军/挑战者试验,一个数字游戏
  5. 学习笔记40-哈希码(HashCode)
  6. DLINK-DSN1100的安装使用记录
  7. Python中的切片
  8. javase(13)_网络编程
  9. 1.8正版生存服务器,我的世界1.8纯净版
  10. SqlDataReader转换为DataTable