剖析hprof文件的两种主要裁剪流派 - Yorek's Blog
性能优化之matrix学习-Resource Canary - 掘金
Koom 解决hprof文件过大-源码解析_stone_cold_cool的博客-CSDN博客_hprof文件过大
Hprof文件通常比较大,分析OOM时遇到500M以上的hprof文件并不稀奇,文件的大小,与dump成功率、dump速度、上传成功率负相关,且大文件额外浪费用户大量的磁盘空间和流量。我们因此想到了对hprof进行裁剪,只保留分析OOM必须的数据,另外,裁剪还有数据脱敏的好处,只上传内存中类与对象的组织结构,并不上传真实的业务数据(诸如字符串、byte数组等含有具体数据的内容),保护用户隐私。
所以HPROF文件在上传到服务器时,一般需要经过裁剪、压缩等工作。比如一个 100MB 的文件裁剪后一般只剩下 30MB 左右,使用 7zip 压缩最后小于 10MB,增加了文件上传的成功率。
下面是原始的HPROF经过各种裁剪方案,最后压缩后的文件大小。
原始大小 | 裁剪后 | zip后 | 备注 | |
---|---|---|---|---|
Shark | 154MB | 154MB | 6M | |
Matrix | 154MB | 26M | 7M | |
KOOM | 154MB | 17M | 3M | 裁剪后的文件需要还原 |
可以看到,HPROF文件的裁剪、压缩过程在上报之前还是非常有必要的。
总体分为两部分,Header和Record,Header记录hprof的元信息,Record分很多条目,每一条有一个单独的TAG代表类型。
我们关注的Record类型主要是HEAP DUMP,其中又分五个子类,分别为GC ROOT、CLASS DUMP、INSTANCE DUMP、OBJECT ARRAY DUMP、PRIMITIVE ARRAY DUMP。
内存中绝大部分数据是PRIMITIVE ARRAY DUMP,通常占据80%以上,而我们分析OOM只关系对象的大小和引用关系,并不关心内容,因此这部分是我们裁剪的突破口。
裁剪分为两大流派:
是否HOOK | 裁剪过程 | 裁剪率 | 是否需要回填 | |
---|---|---|---|---|
Matrix | 不需要 | 先DUMP后裁剪 | 一般 | 不需要 |
KOOM | PLT HOOK | 边DUMP边裁剪 | 更好 | 需要 |