使用shark库解析Hprof文件(一)

2,290 阅读3分钟

背景

做下总结,这篇文章主要介绍下hprof文件结构,以及使用shark库解析hprof文件。

Android Studio中的 Memory Profiler

AS先解析hprof文件,得到相应的数据信息,再进行对应的可视化显示,对应的源码实现,这里就不细说了。

image.png Android Studio中的 Memory Profiler查看某个内存快照文件后,我们可以看到以下的信息。
在classes列表中,您可以看到以下信息:

  • Heap Count: 堆中的实例数。
  • Shallow Size: 此堆中所有实例的总大小。
  • Retained Size: 这个类的所有实例保留的内存总大小。 在类列表的顶部,可以使用左下拉列表在以下堆转储之间切换:
  • App heap: 应用程序分配内存的主堆。
  • Image heap: 系统引导映像,包含在引导期间预加载的类。这里的分配保证永远不会移动或离开。
  • Zygote heap: Android系统中分发应用程序进程的写时复制堆。

默认情况下,列表按保留大小列排序。您可以单击任何列标题来更改列表的排序方式。 在Instance View中,每个实例包括以下内容:

  • Depth:从任何GC根到所选实例的跳数最短。
  • Shallow Size:此实例的大小。
  • Retained Size:此实例支配的内存大小(根据支配者树)。

hprof文件格式

1.hprof 是由 JVM TI Agent HPROF 生成的一种二进制文件。具体文件格式可以看官方文档

image.png

如上图所示,Hprof文件是由文件投和文件内容两部分组成,文件内容是由一系列的record组成,record的类型通过TAG进行区分。

hprof文件读取

整体过程:先读取文件头,再读取 record,根据 TAG 区分 record 的类型,接着按照 HPROF Agent 给出的格式依次读取各种信息。

image.png

对应的数据结构定义

  • 头文件:HprofHeader,记录hprof文件的元信息。
    carbon (2).png
  • 文件内容:HprofRecord就代表了一个Hprof记录,比如StringRecord代表字符串,ClassDumpRecord代表内存的类和接口信息,InstanceDumpRecord代表内存的实例信息。

image.png

头文件解析

image.png 通过调用HprofHeader#parseHeaderOf,按照上面的规则进行解析,就可以得到对应的头文件信息了。

carbon.png

Record内容解析

image.png StreamingHprofReader
从头文件结束的位置,开始进行读取。
开启while循环,不断的读取出每个record的内容。
根据对应的TAG,读取到Body内容,创建对应的Record对象进行保存起来,方便后面查询。

carbon (1).png

HprofHeapGraph

上面读取后的Record信息,都会保存到HprofHeapGraph里面。
通过HprofHeapGraph可以根据条件查找到对应的内存数据。

image.png

比如只需要像下面这样调用,就可以找到内存中所有的Bitmap对象了。
carbon (7).png

RetainedSize计算

ShallowSize:此实例的大小。
RetainedSize:此实例支配的内存大小(根据支配者树进行计算)
Shallow Size和Retained Size的理解:www.jianshu.com/p/851b5bb0a…

构建支配树:ObjectDominators,调用buildDominatorTree,构造出一棵DominatorTree。 返回值是一个Map<Long, DominatorNode>,key是每个实例的objectId,value是对应的树节点DominatorNode。 这样就可以获取到某个实例占用的shallowSize和retainedSize了。 carbon (3).png

内存泄露分析

HeapAnalyzer,调用analyze方法就可以自动进行内存泄露分析,构建GC引用链,找出泄漏路径。

carbon (4).png

判断是否泄漏的规则:
AndroidObjectInspectors定义了一系列Android常用的检查一个对象是否泄漏及其泄漏的规则, 包括 VIEW,EDITOR,ACTIVITY,CONTEXT_WRAPPER,DIALOG 等。
比如找出被销毁的Activity或者Fragment carbon (5).png

carbon (6).png

相关文章

Hprof文件解析
Shallow Size和Retained Size详解
Leakcanary - hprof分析库shark 源码分析

总结

关于Hprof文件和Shark库就这样了。
下一篇再讲下一些自定义分析功能、并使用desktop compose编写可视化页面。