上一篇http://blog.csdn.net/srp123/article/details/78667872介绍了android内存泄露的原理,这一篇介绍Android内存泄露的分析、处理。
一、检测内存泄露
1、adb命令获取内存使用情况
通过命令行adb shell dumpsys meminfo packagename查看内存详细占用情况:
关键字段:
- Private(Clean和Dirty的):应用进程单独使用的内存,代表着系统杀死你的进程后可以实际回收的内存总量**。通常需要特别关注其中更为昂贵的dirty部分,它不仅只被你的进程使用而且会持续占用内存而不能被从内存中置换出存储。申请的全部Dalvik和本地heap内存都是Dirty的,和Zygote共享的Dalvik和本地heap内存也都是Dirty的。
- Dalvik Heap:Dalvik虚拟机使用的内存,包含dalvik-heap和dalvik-zygote,堆内存,所有的Java对象实例都放在这里。
- Heap Alloc:累加了Dalvik和Native的heap。
- PSS:这是加入与其他进程共享的分页内存后你的应用占用的内存量,你的进程单独使用的全部内存也会加入这个值里,多进程共享的内存按照共享比例添加到PSS值中。如一个内存分页被两个进程共享,每个进程的PSS值会包括此内存分页大小的一半在内。
Dalvik Pss内存 = 私有内存Private Dirty + (共享内存Shared Dirty / 共享进程数) - TOTAL:上面全部条目的累加值,全局的展示了你的进程占用的内存情况。
- ViewRootImpl:应用进程里的活动窗口视图个数,可以用来监测对话框或者其他窗口的内存泄露。
- AppContexts及Activities:应用进程里Context和Activity的对象个数,可以用来监测Activity的内存泄露。
3、Android Studio的monitor
二、内存泄露分析
1、分析.prof文件
1.1 如何dump出.prof文件?
-
打开DDMS ,Eclipse 可以切到DDMS视图,Android studio可以从Tools-Android-Android device monitor进入DDMS
-
找到app的进程,在进程上方点击“update heap”按钮,可以先主动出发一次GC,待内存占用数据稍微稳定下来后 点击“Dump HProf File”,便可以导出.prof文件
(1)MAT工具
(2)Android的monitors工具
2、第三方开源工具
2.1 LeakCanary工具
使用方法很简单:
在 build.gradle
中加入引用,不同的编译使用不同的引用:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}
在 Application
中:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}