@linux1s1s
2019-02-14T10:59:00.000000Z
字数 1134
阅读 2577
AndroidMemory
2015-04
Android 内存分析工具
- Eclipse Memory Analyzer Tool 分析内存泄露或者内存使用情况
- TraceView 分析View
- Dump UI Hierarchy for UI Atomator 分析UI层级
这篇文章先介绍Eclipse Memory Analyzer Tool 如何分析内存泄露.
URL: http://download.eclipse.org/mat/1.3.1/update-site/
这里给出上线项目作为例子
首先分析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中可以直接打开使用。