转载

Eclipse内存分析器(MAT) - 教程

本文介绍了使用Eclipse内存分析器(MAT)来识别内存泄漏。
<iframe width="779" height="90" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" onload="var i=this.id,s=window.google_iframe_oncopy,H=s&&s.handlers,h=H&&H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&&d&&(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}" id="aswift_1" name="aswift_1" style="left: 0px; position: absolute; top: 0px; width: 779px; height: 90px;"></iframe>

1.使用Eclipse分析内存泄漏

1.1。Eclipse内存分析器(MAT)工具

Eclipse的内存分析器工具(MAT)是一组插件为Eclipse IDE提供的工具来分析从Java应用程序堆转储,并确定在应用程序内存的问题。这有助于开发人员查找内存泄漏和高内存消耗问题。

它基于Java 堆转储可视化对对象的引用,并提供识别潜在内存泄漏的工具。

1.2。使用堆转储来获取应用程序内存的快照

堆转储是在某一时间点上的Java应用程序中的完整的Java对象图的快照。它以一种称为HPROF的二进制格式存储。

它包含所有对象,字段,基元类型和对象引用。

<iframe id="google_ads_iframe_/6839/lqm.javaeclipseandroid.site/inbetween01_0" title="第三方广告内容" name="google_ads_iframe_/6839/lqm.javaeclipseandroid.site/inbetween01_0" width="728" height="90" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" srcdoc="" style="border-width: 0px; border-style: initial; vertical-align: bottom;"></iframe>

2.安装

通过安装Eclipse MAT 帮助  ▸ 安装新软件...菜单项。从下拉框中选择发布的更新站点,下载内容后,选择General Purpose Tools及其子条目Memory AnalyzerMemory Analyzer(Charts)

MAT的安装

3.为Java程序创建堆转储

可以指示JVM 在内存不足的情况下自动创建堆转储,即在发生OutOfMemoryError错误时。要指示JVM 在这种情况下创建堆转储,请使用-XX:+ HeapDumpOnOutOfMemoryError选项启动Java应用程序

使用文件  ▸ 新建  ▸ 其他...  ▸ 其他  ▸ 堆转储菜单项打开一个对话框,选择哪个进程要取得内存转储。

创建堆转储

在以下对话框中选择堆转储的进程,然后按Finish按钮。

或者,您也可以通过Eclipse交互式创建堆转储。为此,打开内存分析通过的角度  ▸ 打开透视图  ▸ 其他...

打开MAT透视图

如果您手动触发堆的创建,则JVM在写入堆转储之前执行垃圾回收器运行。

4.使用Eclipse内存分析器

4.1。查看堆转储

在创建了一个带有.hprof结尾的新堆转储之后,您可以通过在Eclipse中双击打开它。如果您使用MAT创建堆转储,则应该自动打开。

您可能需要刷新您的项目(项目中的F5)。双击该文件并选择“ 泄漏可疑人报告”

打开泄漏报告

概览页面允许您开始分析堆转储。支配树很快给出了使用对象的概述。

打开支配树

在支配树中你可以看到持有的引用。

MAT统治者树

要找到哪个元素持有对该对象的引用,请选择该条目并从上下文菜单中选择查找GC根的最短路径

4.2。使用Eclipse分析Android堆转储

Android允许创建应用程序堆的堆转储。该堆转储以二进制格式存储,称为HPROF。要创建堆转储,请使用DDMS 透视图中转储HPROF文件按钮

Android堆转储格式类似于Java堆转储格式,但不完全相同。Eclipse MAT可以直接使用Android堆转储格式。

<iframe id="google_ads_iframe_/6839/lqm.javaeclipseandroid.site/inbetween02_0" title="第三方广告内容" name="google_ads_iframe_/6839/lqm.javaeclipseandroid.site/inbetween02_0" width="728" height="90" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" srcdoc="" style="border-width: 0px; border-style: initial; vertical-align: bottom;"></iframe>

5.举例

5.1。创建项目

创建名为com.vogella.mat.first的Java项目com.vogella.mat.first包。创建以下类。

package com.vogella.mat.first;

import java.util.ArrayList;
import java.util.List;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        while (1<2){
            list.add("OutOfMemoryError soon");
        }

    }

}

5.2。创建堆转储和分析

在Eclipse中,将-XX:+ HeapDumpOnOutOfMemoryError添加到运行时配置中。

dumpparameter10

运行该项目。它崩溃并写入堆转储

在MAT中打开堆转储并熟悉使用MAT工具。

6. jconsole

您还可以通过jconsole交互式创建堆转储,这是JDK中包含的一个工具。在命令行中键入jconsole以启动它。

要允许Java程序访问jconsole,请使用-Dcom.sun.management.jmxremote start选项。

使用它们MBeans | com.sun.management | HotSpotDiagnostics | 操作| DumpHeap。

更多信息可以在JConsoleJConsole教程中找到

<iframe width="779" height="90" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" onload="var i=this.id,s=window.google_iframe_oncopy,H=s&&s.handlers,h=H&&H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&&d&&(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}" id="aswift_2" name="aswift_2" style="left: 0px; position: absolute; top: 0px; width: 779px; height: 90px;"></iframe>

8.链接和文学

8.2。vogella GmbH培训和咨询支持


原文地址:http://www.vogella.com/tutorials/EclipseMemoryAnalyzer/article.html
正文到此结束
Loading...