首页 > 系统相关 >Android使用MAT分析内存泄露

Android使用MAT分析内存泄露

时间:2022-11-22 11:31:52浏览次数:29  
标签:MAT Person 对象 person 内存 Android 泄露


一.概述

首先来普及一下什么是内存泄露:
内存泄露是指对象的内存在分配之后无法通过程序的执行逻辑释放对该对象的引用,导致不能回收该对象所占内存。
内存泄露会导致以下情况:
1.程序卡顿,响应速度慢(内存占用高时JVM虚拟机会频繁触发GC)
2.莫名消失(当你的程序所占内存越大,它在后台的时候就越可能被干掉。反之内存占用越小,在后台存在的时间就越长)
3.直接崩溃(OutOfMemoryError)
内存泄露在Android开发中是很容易遇到的,但是我们一般很难察觉到,那么此时就要借助一些工具来帮助我们分析内存情况了,今天就来看看如何使用进行内存泄露分析。

二.分析

所需要的工具

  • Android Studio 1.1 或者更高版本
  • Eclipse Memory Analyzer
    实例代码1:
public class MainActivity extends Activity {
TextView textView;
public static final String TAG = MainActivity.class.getSimpleName();
List list = new ArrayList();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
while (true)
{
Person person=new Person();
list.add(person);
person=null;
}
}
}

这是一个非常基础的Activity.我们使用了一个死循环,不断向集合中添加对象,毫无疑问,当程序运行起来的时候直接就会出现下面的情况:

Android使用MAT分析内存泄露_内存溢出

Android使用MAT分析内存泄露_内存泄露_02

没错,就是内存溢出(OOM),下面我们看看如何使用MAT这个工具来分析是什么原因导致了内存溢出呢。

当程序崩溃后,我们切换到DDSM视图,

Android使用MAT分析内存泄露_内存溢出_03

首先我们点击当前进程的名称,然后点击上方的Update Heap按钮,然后点击Dump HPROF file按钮,这是如果你的Eclipse装有MAT插件的话,就会自动打开hprof文件。

Android使用MAT分析内存泄露_内存溢出_04

然后我们在下面可以看见可疑对象描述报告图1

Android使用MAT分析内存泄露_内存溢出_05

我们点击Detail,

图2,从根元素到内存消耗聚集点的最短路径

Android使用MAT分析内存泄露_内存溢出_06


继续向下看,

图3,内存消耗对象信息

Android使用MAT分析内存泄露_内存溢出_07

在这张图上,我们可以清楚的看到,这个对象集合中保存了大量 Person对象的引用,就是它导致的内存泄露。
至此,我们已经拥有了足够的信息去寻找泄露点,回到代码,我们发现,是下面的代码导致了内存泄露 :

while (true)  
{
Person person=new Person();
list.add(person);
person=null;
}

总结
从上面的例子我们可以看到用 MAT 来进行堆转储文件分析,寻找内存泄露非常简单,尤其是对于新手而言,这是一个很好的辅助分析工具。但是,MAT 绝对不仅仅是一个“傻瓜式”内存分析工具,它还提供很多高级功能,比如 MAT 支持用 OQL(Object Query Language)对 heap dump 中的对象进行查询,支持对线程的分析等,有关这些功能的使用可以参考 MAT 的帮助文档。


标签:MAT,Person,对象,person,内存,Android,泄露
From: https://blog.51cto.com/u_10847930/5877262

相关文章

  • Android网络类型判断
    在Android开发中,我们有时候需要根据当前网络的类型去做一些操作,下面看看如何判断当前网络的状况:publicclassNetWorkUtil{privatestaticConnectivityManagermanage......
  • Unity :Android局域网通信、UDP广播实现控制器开关(继电器)
    要解决的问题:1.UDP广播:因为平板控制的不仅仅是继电器,还有其他电脑2.继电器接收的是16进制指令,所以要把12个按钮1-12转换成16进制,要不然一个个的发送太麻烦,这里是指令的理......
  • 内存表(FDMEMTABLE)
    内存表的优点是快,非常快,号称比BDE的clientdataset快很多。内存表不但快,还可以另存为XML、BIN、CSV等数据。也可直接作为stream传送。所以,追求速度的时候,获得数据后即解除锁......
  • format用法详解
    format是字符串内嵌的一个方法,用于格式化字符串。以大括号{}来标明被替换的字符串。1、基本用法1.按照{}的顺序依次匹配括号中的值s="{}isa{}".format('Tom','B......
  • Linux无头模式使用mat分析dump的方法
    摘要mat可以很好的进行jvm的内存dump的分析.但是大部分服务器是没有GUI界面的.而且就算是有GUI界面也很难直接使用.但是随着jvm堆区越来越大.WindowsPC机器已经很难......
  • [Android开发学iOS系列] TableView展现一个list
    TableView基础本文讲讲TableView的基本使用.顺便介绍一下delegation.TableView用来做什么TableView用来展示一个很长的list.和Android中的RecyclerView不同,iOS中的......
  • 使用DocumentFormat.OpenXml 从Excel 导入数据
    publicList<DailyStock>ReadExcelFile(stringfileName){List<DailyStock>list=newList<DailyStock>();DataTabledt=ReadExcelFileToDataTable(fi......
  • MAC环境Android SDK环境变量配置
    打开.bash_profile文件exportANDROID_HOME=/Users/liwen/Library/Android/sdkexportPATH=${PATH}:${ANDROID_HOME}/platform-toolsexportPATH=${PATH}:${ANDROID_HOME}/t......
  • Day18.2:对象创建的内存分析图解
    对象创建的内存分析我们从两块最常用的内存空间对对象创建进行内存分析堆内存:存放的是对象的具体信息;在程序之中堆内存空间的开辟是通过new完成的栈内存:存放的是对象的......
  • 修复 docker build 错误 "-t, --tag" flag: invalid reference format
    问题今天构建镜像时遇到一个错误:原因排查且也经过试验,应该是docker的镜像tag不允许包含/、#字符。解决调整一下生成docker镜像tag的方案,或者是简单粗暴地......