转载出自于内存管理工具Memory Analyzer的使用

安装

关于Eclipse Memory Analyzer的安装,网上有很多教程,我选择的是直接通过Eclipse插件的形式安装最新的Memory Analyzer。步骤如下:

  1. 打开eclipse->Help->Install new software->work with右边的Add...显示下图:

    这里使用的网址是:http://download.eclipse.org/mat/1.5/update-site/
    具体版本下载地址可以参考下面的网址 http://www.eclipse.org/mat/downloads.php

    1. 出现如下界面的时候,对应部分选上,然后一直下一步就可以了。

      不过插件形式的安装需要等待比较久的时间。不过还是可以安装好的。

很简单的安装步骤不是么。接下来看看如何使用。

使用

Memory Analyzer主要分析的是内存的使用情况,它能够打开的是.hprof格式的文件。为了得到该文件,我们先写好如下简单代码:

  1. package memoryManage;
  2. import java.util.*;
  3. /*
  4. * 根据书本2.4.1章节的代码书写
  5. * VM args: -Xms20m -Xmx20M -XX:+HeapDumpOnOutOfMemoryError
  6. */
  7. public class HeapOOM {
  8. int num;
  9. public HeapOOM() {
  10. num = 100000;
  11. // TODO Auto-generated constructor stub
  12. }
  13. public static void main(String[] args) {
  14. List<HeapOOM> list = new ArrayList<HeapOOM>();
  15. while(true)
  16. list.add(new HeapOOM());
  17. }
  18. }

很简单不是么,为了让内存溢出罢了。不过先不要运行该程序,需要进行相应的设置之后才会有.hprof格式的文件生成。请看下图:

打开该程序的Debug Configurations之后,可以看到下图:

此时点击Arguments,设置VM参数为:
-verbose:gc -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError

参数含义:

–verbose:gc 在虚拟机发生内存回收时在输出设备显示信息,格式如下: [Full GC 268K->168K(1984K), 0.0187390 secs]该参数用来监视虚拟机内存回收的情况。
-Xms20M 设置应用程序的初始内存大小为20M
-Xmx20M 设置应用程序的能够使用的最大内存为20M(与-Xms设置大小相同可以避免堆自动扩展)
-XX:+HeapDumpOnOutOfMemoryError 可以让虚拟机在出现内存异常的时候自动Dump出当前的内存对转储快照以便日后进行分析

设置好了之后,点击apply,点击确定,那么就可以运行上面的程序,最后控制台输出如下:

这个时候,可以发现,已经生成了java_pid11072.hprof文件。那么,我们就可以尝试着去通过我们下载好的Memory Analyzer去分析了。我们通过下面的方式打开该文件:点击file的open file

找到存放本程序的文件夹,可以发现有这个java_pid11072.hprof文件,打开即可。

打开之后,是这个样子的。

分析性能

当然,我们可以很容易发现这个程序的问题,在Memory Analyzer的诊断中也给了我们提醒:

截图的意思是说:主线程的局部变量占据了太多的内存,达到了97.36%。实际上,一个ListArray自身占据不了多少内存,注意是其中的实例对象在一直创建,每创建一个对象就要放置到堆内存里面去,由此导致了堆内存溢出。

例子中的问题自然好办,我们自己也可以查找出来。但是我们想使用Memory Analyzer做一些更多的工作,真正帮助我们排查出内存问题。那么我们就需要好好研究研究一番这个该怎么弄。

推荐一个英文网址:http://eclipsesource.com/blogs/2013/01/21/10-tips-for-using-the-eclipse-memory-analyzer/

Shallow heap vs Retained heap

你很快就会在浏览的时候发现这两个词,那么它们是什么意思呢?
参考的是:http://bjyzxxds.iteye.com/blog/1532937

Shallow Size

对象自身占用的内存大小,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。
针对数组类型的对象,它的大小是数组元素对象的大小总和。

Retained Size

Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。

我们先来看看截图信息,加深对以上意思的理解:

截图可以看到,main线程自身占用的内存只不过是120Byte,但是如果将main线程GC掉之后,可以去除掉16,207,160Byte,也就是说有极大部分的内存是与其相关联的。只要找到一个办法去掉它的话,那可真的是大快人心啊(别傻,main线程没了怎个程序就没了,别闹哈)

同样的,让我们来看看memoryManage.HeapOOM @ 0xfec00000这个对象,它占用的内存是16Byte,但是它的Retained Heap也是16Byte。说明该项并不会导致内存问题。

Dominator 树视图

实际上,上图演示的就是一颗Dominator 树视图,通过它可以更加理解Retained Heap。在垃圾回收机制中有一个GC Roots,它其实就是这棵树的根root。

An Object X is said to dominate an Object Y if every path from the Root to Y must pass through X. Looking at the dominator tree for our example, we can start to see where the bulk of our memory is leaking.

Path to GC Roots

我们针对某一个对象,可以点击右键,然后点击Path to GC Roots,得到该对象所对应的类(并不是该对象,值得注意)到GC Roots 的路径(有各种选项供选择):

比如上图的memoryManage.HeapOOM @ 0xfec00000,可以看到它有两条路径通往GC Roots:

这个选项在必要的时候非常有用,可以让你看清楚这个类与周围的关联性。

结语

就介绍到这里了,没有太多的项目经验,只能对着别人的资料瞎说一阵。等有了更深刻的经验之后,再来补充吧。

内存管理工具Memory Analyzer的使用相关推荐

  1. Eclipse安装内存分析工具(Memory Analyzer)

    1.Help -->Eclipse Marketplace 搜索Memory 2.点击confirm 3.点击红色框框选中的按钮 4.安装完重启后

  2. new arraylist内存_Java内存泄漏分析工具Memory Analyzer Tool

    阅读文本大概需要3分钟. 一个大型的Java项目也许从开发到测试结束并可能不能未发现一些重大的问题,但是在生产环境中还是会出现一些非常棘手的问题,如内存泄漏直接导致服务宕机,遇到这样的问题对于一个经验 ...

  3. eclipse占用内存过大_Java内存泄漏分析工具Memory Analyzer Tool

    一个大型的Java项目也许从开发到测试结束并可能不能未发现一些重大的问题,但是在生产环境中还是会出现一些非常棘手的问题,如内存泄漏直接导致服务宕机,遇到这样的问题对于一个经验尚浅的开发人员来说难度非常 ...

  4. eclipse无法创建java虚拟机_手把手:Java内存泄漏分析Memory Analyzer Tool

    点击上方"IT牧场",选择"设为星标"点击上方"IT牧场",选择"设为星标"技术干货每日送达 阅读文本大概需要3分钟. ...

  5. 内存整理工具 Memory Booster

    电脑在运行一段时间后,内存可用资源就会变少,利用内存管理工具-- MemoryBooster ,能够随时自动调整电脑内存,让系统保有足够的内存可用空间,以藉此提升电脑的运行速度.它的原理是将以往驻留物 ...

  6. HALCON:内存管理(Memory Management)

    HALCON:内存管理(Memory Management)

  7. Linux内存管理Linux Memory Management Notes

    Linux 内存基础 地址类型 linux内核中有许多种不同的地址类型 用户虚拟地址 用户空间看到的常规地址,通过页表可以将虚拟地址和物理地址映射起来 物理地址 用在cpu和内存之间的地址叫做物理地址 ...

  8. matlab内存管理工具,[转载]MATLAB内存管理

    今天用Matlab跑程序,由于数据量太大,又出现 Out of memory. Type HELP MEMORY for your options.的问题.看到这篇文章非常实用,转过来方便查阅~ 用 ...

  9. Android 内存管理 amp;Memory Leak amp; OOM 分析

    1.Android 流程管理&内存 Android主要应用在嵌入式设备其中.而嵌入式设备因为一些众所周知的条件限制,通常都不会有非常高的配置,特别是内存是比較有限的. 假设我们编写的代 码其中 ...

最新文章

  1. 基于网络监听方式的电子邮件实现基础
  2. 下一次工业革命:计算生物学与生物平台
  3. JavaScript函数的各种调用模式
  4. 存储过程提示data truncation_手机DATA重新分区教程(超详细)
  5. mysql不支持python3吗_MySQL的4种事务隔离级别你还不清楚吗?
  6. 【招聘(广州)】-年薪30W起-自助打印领域业内第一
  7. [Spring5]IOC容器_Bean管理XML方式_注入集合类型属性
  8. 卡尔曼滤波对gps轨迹数据清洗_基于GPS的智能交通系统车辆定位精度提升技术
  9. 基于Flask框架的Python web程序的开发实战 二 项目组织结构
  10. Redis中struct运用
  11. 元旦大礼,JavaScript第四版红宝书送20本!
  12. 一文详解双目立体匹配算法:ELAS
  13. 各版本的QT源码下载地址
  14. RLS实现求解最小二乘确定性正则方程
  15. Qt程序退出QThread: Destroyed while thread is still running问题
  16. vscode 文件图标主题
  17. Luogu 1894 [USACO4.2]完美的牛栏The Perfect Stall
  18. [用友]报表格式异常的处理
  19. 解决:启动program时出现问题,找不到指定模块
  20. reason: 'Multiplier is not finite! That's illegal. multiplier:nan' *** First throw call stack:

热门文章

  1. 最新HR月报总结PPT模板资料包
  2. Dreamweaver8安装后无法启动
  3. python 语音转文字_基于python将音频文件转化为文本输出
  4. 485地址测试软件,485测试软件的安装配置
  5. 云客Drupal源码分析之音译转化Transliteration
  6. 湖南hp服务器虚拟化解决方案,HP刀片服务器虚拟化整合解决方案.docx
  7. Windows远程桌面跳板机无法复制粘贴
  8. java查看线程使用情况,查看java的线程cpu使用情况
  9. 魔兽8.0最新服务器人口普查,魔兽世界人口普查8.0版最新资讯!赶紧来了解!
  10. 稀疏矩阵csc_matrix函数的使用理解