如何用MAT分析Android程序的内存泄露

本文结合《Android开发艺术探索》书籍中的内存分析例子来讲解如何利用MAT工具来查找内存泄漏(以AndroidStudio开发工具为例)。

1、下载MAT(Eclipse Memory Analyzer)工具,windows64位网盘下载地址:http://pan.baidu.com/s/1pLlbOBD,或者通过官网下载:https://www.eclipse.org/mat/downloads.php,下载完毕后解压即可,目录结构如下:

2、模拟内存泄漏的场景,源码如下,启动退出三次app即可。

  代码结构如下

MainActivity.java
package androidstudy.androidartstudy05;

import android.content.Context;import android.os.Bundle;import android.os.SystemClock;import android.support.v7.app.AppCompatActivity;import android.util.Log;

import androidstudy.androidartstudy05.manager.TestManager;

public class MainActivity extends AppCompatActivity implements TestManager.OnDataArrivedListener {    private static final String TAG = "MainActivity";

    private static Context sContext;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);

        sContext = this;        TestManager.getInstance().registerListener(this);    }

    private synchronized void testANR() {        SystemClock.sleep(30 * 1000);    }

    private synchronized void initView() {

    }

    @Override    public void onDataArrived(Object data) {        Log.i(TAG, data.toString());    }}
TestManager.java
package androidstudy.androidartstudy05.manager;

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

/** * Created by Administrator on 2016/7/19. */public class TestManager {    private List<OnDataArrivedListener> mOnDataArrivedListeners = new ArrayList<OnDataArrivedListener>();

    private static class SingletonHolder {        public static final TestManager INSTANCE = new TestManager();    }

    private TestManager() {    }

    public static TestManager getInstance() {        return SingletonHolder.INSTANCE;    }

    public synchronized void registerListener(OnDataArrivedListener listener) {        if (!mOnDataArrivedListeners.contains(listener)) {            mOnDataArrivedListeners.add(listener);        }    }

    public synchronized void unregisterListener(OnDataArrivedListener listener) {        mOnDataArrivedListeners.remove(listener);    }

    public interface OnDataArrivedListener {        public void onDataArrived(Object data);    }}3、点击AndroidStudio界面的Monitor按钮打开DDMS界面,如下图所示,点击Dump HPROF file(红色框框标记)按钮导出一个hprof后缀的文件androidstudy.androidartstudy05.hprof保存到platform-tools下(放到此目录是为了下一步方便转换文件),我的路径为E:\Android\sdk\platform-tools

4、由于导出后的文件不能直接被MAT识别,所以需要通过hprof-conv命令转换一下,此命令是Android SDK提供的工具,位于platform-tools下,cmd命令切换到此目录后输入hprof-conv androidstudy.androidartstudy05.hprof androidstudy.androidartstudy05-conv.hprof命令回车,   会在platform-tools目录下生成一个androidstudy.androidartstudy05-conv.hprof文件,如下图:

5、打开MAT工具,导入转换后的文件androidstudy.androidartstudy05-conv.hprof,打开后界面如下:

6、点击“Histogram”按钮,展示界面如下,在红色框框中输入应用的包名androidstudy.androidartstudy05

7、通过下图结果可以看到MainActivity对象有三个(正常只会出现一个),很明显MainActivity存在内存泄漏

8、在MainActivity上点击右键->"Merge Shortest Paths To GC Roots"->"exclude all phantom/weak/soft etc.refrences"。

9、在打开的界面即可看到详细的引用详情

10、可以看到有三处引用了MainActivity对象,两处为单例对像列表(List<OnDataArrivedListener>)属性mOnDataArrivedListeners 持有,一处为静态变量private static Context sContext;持有


				
时间: 2024-10-09 00:39:52

如何用MAT分析Android程序的内存泄露的相关文章

如何使用MAT分析Android程序的内存问题

 Please refer to https://developer.android.com/tools/debugging/debugging-memory.html,http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html. In DDMS, got an Android  HPROF file. Run SDK tool hprof-conv.exe to convert the An

在Eclipse中使用MAT分析Android程序内存使用状况(转)

对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题是一件很有难度的工作,一般都是由团队中的资深工程师负责,而且随着程序代码量的提高,难度还会逐步加大. 今天要介绍一个在Eclipse中使用的内存分析工具——MAT(Eclipse Memory Analyzer,主页在http://www.eclipse.org/mat/).它是一个功能非常丰富的J

如何用MAT分析Android应用内存泄露

使用工具:Android Studio 2.0 Preview, Android Device Monitor, MAT(Memory Analyzer). 点击Android Studio工具栏上的“Android Device Monitor”,如下图 打开后选中应用进程,然后点击“Update heap”,接着反复点击应用的每个activity,最后“Dump HPROF file”,如下图1-2-3所示 保存hprof文件. 下面需要对hprof文件进行转换. 打开CMD终端,进入到\s

Chapter2——如何分析Android程序(一)

前几天买了<Android软件安全与逆向分析>这本书,决定在这里记一些笔记. 第一章介绍了如何搭建环境,此处略去:第二章开始讲分析Android程序. 下面按顺序记录关键内容. -------------------------------------- 2.1.编写一个需要填写注册码的APK 要破解要现有「试验品」,作者编写了一个叫做crackme02的APP, 主要代码有: MessageDigest digest = MessageDigest.getInstance("MD5

安全和逆向:如何逆向分析Android程序

经过前面对各种反编译工具apktool,dx2jar,jd-gui等工具的介绍,本章节我们结合一个实际的案例,向大家讲解如何分析Android程序. 一.分析步骤 1.使用dex2jar和jd-gui工具分析Java反编译源码: 2.使用apktools,反编译Smail文件.由于Smail语法单独阅读比较困难,我们可以结合Java反编译的源码进行分析: 3.根据相关的特征和线索,修改Smail源码,使用apktools重新打包: 4.使用jarsigner重新签名apk,安装并验证修改是否正确

查找并修复Android中的内存泄露—OutOfMemoryError

[编者按]本文作者为来自南非约翰内斯堡的女程序员 Rebecca Franks,Rebecca 热衷于安卓开发,拥有4年安卓应用开发经验.有点完美主义者,喜爱美食. 本文系国内ITOM管理平台 OneAPM 编译呈现,以下为正文. Android 程序中很容易出现内存泄露问题.毫无戒心的开发者可能每天都会造成一些内存泄露,却不自知.你可能从未注意过这类错误,或者甚至都不知道它们的存在.直到你遇到下面这样的异常: java.lang.OutOfMemoryError: Failed to allo

用MAT分析JAVA程序运行时的内存使用情况

Java出现OutOfMemoryError或者发现Java应用程序占用的内存很异常,那么我们一般采用下面的步骤分析:A. 把Java应用程序使用的heap dump下来B. 使用Java heap分析工具,找出内存占用超出预期的嫌疑对象C. 根据情况,分析嫌疑对象和其他对象的引用关系.D. 分析程序的源代码,找出嫌疑对象数量过多的原因.以下面的代码为例: public class TObject { int[] arr = new int[20000]; } public class Test

分析Android程序之破解第一个程序

破解Android程序通常的方法是将apk文件利用ApkTool反编译,生成Smali格式的反汇编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用ApkTool重新编译生成apk文件并签名,最后运行测试,如此循环,直至程序被成功破解. 1. 反编译APK文件 ApkTool是跨平台的工具,可以在windows平台与linux平台下直接使用.使用前到:http://code.google.com/p/android-apktool/  下载ApkTool,

如何分析Android程序之破解第一个程序

破解Android程序通常的方法是将apk文件利用ApkTool反编译,生成Smali格式的反汇编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用ApkTool重新编译生成apk文件并签名,最后运行测试,如此循环,直至程序被成功破解. 1. 反编译APK文件 ApkTool是跨平台的工具,可以在windows平台与linux平台下直接使用.使用前到:http://code.google.com/p/android-apktool/  下载ApkTool,