【hprof】hprof文件的查看和解析

【hprof】hprof文件的查看和解析,第1张

HPROF: A Heap/CPU Profiling Tool

https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html

如何分析.hprof文件

https://qastack.cn/programming/185893/how-do-i-analyze-a-hprof-file

使用 HPROF 概要文件分析器

https://www.ibm.com/docs/zh/sdk-java-technology/7?topic=tools-using-hprof-profiler

Java - 获取JVM堆快照文件(hprof文件)教程

https://www.hangge.com/blog/cache/detail_3111.html

HPROF 输出文件的说明

https://www.ibm.com/docs/zh/sdk-java-technology/7?topic=profiler-explanation-hprof-output-file

关于java:为如猜什么hprof文件败橡滑的大小比给jvm的内存量小得察腊多

https://www.codenong.com/5646455/

深入浅出JProfiler

https://developer.aliyun.com/article/276

Introduction To JProfiler

https://www.ej-technologies.com/resources/jprofiler/help/doc/main/introduction.html#jprofiler.introduction

使用JProfiler进行内存分析

https://www.cnblogs.com/onmyway20xx/p/3963735.html

深入浅出JProfiler

https://developer.aliyun.com/article/276

内存泄漏无疑会或亮严重影响用户体验,一些本应该废弃的资源和对象无法被释放,导致手机内存的浪费,app使用的卡顿,那么如何排查内存泄漏呢?

当然,首先我门有google的官方文档可以参考:

大部分博客的方法也来自于此。总的来说,就是使用android studio 的monitor memory功能监测app主进程占用的内存,触发GC *** 作,而后观察内存的占用情况,如果在使用的过程中内存不断增加,没有回落, 很有可能 发生了内存泄漏,这时候就需要导出内存分配的具体详情饥团答进行深入分析了。

但是事实上,通过观察这个内存曲线的曾场来或者是观察allocate tracker中的allocate data数值的增长来检测是否有内存泄漏问题,真的很玄,因为往往内存泄漏发生了,但是GC仍然可以通烂慧过回收其他对象的方式腾出空间,导致这个数据的变化基本看不出来,甚至是减小的,所以我觉得这种方式, 就像是让你用手掌去感知婴儿的体温,去检测确定这个婴儿有没有发烧一样,非常不靠谱不准确。

那么,重点来了,我的方法,简单直观,保准你一学就会!

先说一个terminal指令: 

这条指令是用来查询这个进程所占用的内存的具体详情的,通过这条指令可以看到当前app在手机中占用的具体的堆内存大小,view的数量, activity的数量 ,等等。如下图:

其中activity数目是非常关键的一个信息,可以帮助我们快速地检测出内存泄漏。我们可以反复地进入退出需要测试的目标activity,如果在反复进入退出之后,用terminal执行上面的语句查询当前的内存情况,如果发现activity数量一直在增长,那么内存泄露一定是发生了!

内存泄漏已经发生,如何定位原因呢?

如下图,在android studio中开始memory monitor,点击init GC,反复进入退出发生了内存泄漏的activity,这时候点击生成内存文件,这之后android studio会自动打开生成的.hprof文件。选中该文件转化成标准的hrof文件。

用MAT工具打开生成的.hprof文件,点击如下所示的图标,可以看到内存中的对象列表。

考虑到大内存的泄漏都是因为Activity被destroy之后却仍然被其他对象持有而造成的,因此首先解决棘手问题,直接搜索Activity,如下。发现有Activity的实例个数是3,跟实际不符,明显这个activity导致内存泄漏了,按照如图的方式找到它的引用,也就是导致内存泄漏的幕后凶手!

可以看到这个例子中的内存泄漏是由一个HandlerThread引发的,那么找到这个问题的位置,在合适的地方(如ondestroy)将这个handler thread释放即可。

如下图所示: 在android studio中打开生成的hprof文件,在右侧边栏会出现的Analyzer Tasks工具,点击执行图标,即可出现检测分析的结果,得到哪些activity被泄漏了,这些被泄漏的activity被谁引用了。

可以看到内存泄漏由AsyncHandler引起,需要在activity生命周期结束的时候进行释放。

方法2不用安装MAT工具,更加便捷哦~

 有问题可以留言,谢谢您的阅读~~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12194990.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存