Andriod 性能优化之 HPROF 文件分析

在 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

hrpof

各个参数说明:
hrpof

选择指定堆

  • App heap - 当前app使用的堆
  • Image heap - 当前app在硬盘上的内存映射
  • Zygote heap - zygote 复制时继承来的库、运行时类和常量的数据集。zygote空间设备启动时创建,从不分配这里的空间。

选择视图选项:

  • Class List View
  • Package Tree View

分析流程

  • 在HPROF文件查看工具中选择一个类名;
  • 选择该类的一个实例;
  • 查看引用树;
  • 当需要的时候可以右键引用树种的条目跳转到源码或者实例;
  • 使用 Analyzer Tasks 分析 Activity 泄漏信息 和 重复定义的字串;

其它