在 AndroidStudio 中使用 Android Device Monitor 里的Memory Monitor工具监视内存使用情况,可以把Java堆快照转储到Android HPROF文件中。HPROF在Android Studio 中可以直接打开并列出类、类的实例和实例的引用树,以此来帮助你跟踪内存的使用情况,找出内存泄漏的地方。HPROF最初是由J2SE支持的一种二进制堆转储格式。
每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。
在AndroidStudio中,通过 Tools -> Android Device Monitor
打开DDMS,选中要分析的应用,点击Update Heap
开始堆内存使用情况收集,点击Dump Hprof File
导出 HPROF 文件。
为什么要查看Java堆
Java堆展示如下信息:
- 按类展示实例对象的内存使用情况;
- 每次垃圾回收事件的样本数据,不管是系统触发还是你手动触发的垃圾回收事件;
- 帮助分析哪些对象类型也许会导致内存泄漏。
HPROF文件只是展示了某一时刻Java堆的使用情况,如果你需要了解某段时间内Java堆使用情况的, 你需要通过分析不同时间点生成的HPROF文件来找出其中的变化。HPROF分析工具可以自动分析出以下两种类型的问题:
- 已经被销毁,但是不能回收的Activity的实例;
- 重复定义的字符串;
查看HPROF
各个参数说明:
选择指定堆
- App heap - 当前app使用的堆
- Image heap - 当前app在硬盘上的内存映射
- Zygote heap - zygote 复制时继承来的库、运行时类和常量的数据集。zygote空间设备启动时创建,从不分配这里的空间。
选择视图选项:
- Class List View
- Package Tree View
分析流程
- 在HPROF文件查看工具中选择一个类名;
- 选择该类的一个实例;
- 查看引用树;
- 当需要的时候可以右键引用树种的条目跳转到源码或者实例;
- 使用 Analyzer Tasks 分析 Activity 泄漏信息 和 重复定义的字串;