[关闭]
@linux1s1s 2019-02-14T10:59:00.000000Z 字数 1134 阅读 2572

Android 内存分析(一)

AndroidMemory 2015-04


Android 内存分析工具

  • Eclipse Memory Analyzer Tool 分析内存泄露或者内存使用情况
  • TraceView 分析View
  • Dump UI Hierarchy for UI Atomator 分析UI层级

这篇文章先介绍Eclipse Memory Analyzer Tool 如何分析内存泄露.

Install MAT

此处输入图片的描述
URL: http://download.eclipse.org/mat/1.3.1/update-site/

Before Analynic

此处输入图片的描述

  1. 点击DDMS
  2. 找到需要分析的App 进程
  3. 在该进程打上 Update Heap

内存泄露实例分析

这里给出上线项目作为例子

首先分析MainActivity,一般App退出后会回收,如果未做回收,表示内存泄露,点击 Dump HPROF file 进入MAT

此处输入图片的描述

点击Dmninator Tree

此处输入图片的描述

在 Regex处输入 MainActivity_Tablet回车(每个项目的MainActivity命名都不同,这里依据不同项目的MainActivity不同输入不同)

此处输入图片的描述

可以看到有一个MainActivity_Tablet的引用,这是正常的,此时退出,然后再按照上面的流程进入,如果此时有多余一个该引用,就说明该引用未被释放,存在内存泄露情况,为了使情况更客观,可以在进入MAT前,手动回收一下堆

此处输入图片的描述

点击 Cause GC即可强制回收堆。

此处输入图片的描述

可以看到仅仅有一个MainActivity_Tablet引用,所以可以肯定无内存泄露情况,如果多次启动App,而在启动几次以后,发现即使手动GC仍然有多个MainActivity_Tablet引用,那么可以断言,内存泄露在MainActivity_Tablet代码中,如果你读过Android 内存泄露 (一)或者Android 内存泄露 (二)这两篇文章,你可能会找到内存泄露问题在哪里,总之一句话概括如下:

非静态内部类或者匿名类具有比外部类更长的生命周期的情况

这种情况及其容易引起内存泄露,当然上面两篇文章只是个例,还有其他典型例子,比如 注册回调 一般都需要手动 注销回调 ,尤其是系统的回调,为神马系统的回调要尤其注意呢?因为系统的回调生命周期要比单独的App进程周期大很多,这个很容易理解。而大多数情况下,我们很容易记得 注册回调 ,而多数情况下,反而容易忘掉 注销回调 ,所以内存泄露往往是Android程序员自己造成的。

TIPS:如果我们想保存这个内存分析报告,可以在以下路径中找到
C:\Users\Administrator\AppData\Local\Temp
找到eclipse中打开的文件名,然后保存到另外的路径以备后用,下次直接拖动该文件到eclipse中可以直接打开使用。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注