androidhprof分析(android hprof)
本篇目录:
1、如何从log中看到内存泄露问题点2、怎么排查这些内存泄漏3、如何生成hprof文件4、手机dump.gc文件下的这些hprof文件是什么?能删除吗如何从log中看到内存泄露问题点
分析在程序逻辑中对动态分配的内存有没有手动进行释放,打开的文件描述符有没有关闭等这些代码一点点的去分析,当然这也是熟悉代码,了解的一个过程。
一般分析内存泄露, 首先运行程序,打开日志控制台,有一个标签Memory ,我们可以在这个界面分析当前程序使用的内存情况, 一目了然, 我们再也不需要苦苦的在logcat中寻找内存的日志了。
此时就要进入代码分析此时antiRadiationUtil的引用持有是否合理(如果antiRadiationUtil持有了MainActivity的context导致节目退出后MainActivity无法销毁,那一般都属于内存泄露了)。
点击Device窗口工具栏的第二个图标(Update Heap),(4) 点击右边的窗口的Cause GC按钮,即可得到当前程序的Heap信息 同样,随着程序的运行,多次点击得到的Heap大小,如果只增不减的话,也昭示着你的程序有内存泄漏。
内存泄漏的检查方法:ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。Dmalloc-Debug Malloc Library.Electric Fence-Linux分发版中由Bruce Perens编写的malloc()调试库。
怎么排查这些内存泄漏
1、Memory Analyzer-是一款开源的JAVA内存分析软件,查找内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse RCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件。
2、通常我们可以借助MAT、LeakCanary等工具来检测应用程序是否存在内存泄漏。 MAT是一款强大的内存分析工具,功能繁多而复杂。
3、在data object一行中有一列是“Total Size”,其值就是当前进程中所有Java数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。
4、如下图所示: 在android studio中打开生成的hprof文件,在右侧边栏会出现的Analyzer Tasks工具,点击执行图标,即可出现检测分析的结果,得到哪些activity被泄漏了,这些被泄漏的activity被谁引用了。
5、试着使用关于application的context来替代和activity相关的context这是一个很隐晦的内存泄漏的情况。有一种简单的方法来避免context相关的内存泄漏。最显著地一个是避免context逃出他自己的范围之外。使用Application context。
6、然而使用内存的进程千千万,整个服务器的内存增长似乎也不能判断某个进程的内存有泄露。因此在稳定性测试过程中往往需要全程关注指定进程的内存消耗,比如运行3天、7天。
如何生成hprof文件
在命令行中运行 Java 程序时,需要使用 -XX:+HeapDumpOnOutOfMemoryError 参数。这会在程序遇到内存溢出时自动生成内存快照。当程序遇到内存溢出时,会在程序所在的目录中生成一个 hprof 文件,该文件就是内存快照。
若要在java进程启动的时候使用HPROF,用户可以通过各种命令行参数类型来使用HPROF对java进程的heap或者 (和)cpu进行profiling的功能。HPROF产生的profiling数据可以是二进制的,也可以是文本格式的。
hprof文件是java的heap快照,所以只能反映那个时刻的内存情况,在获取快照的时候建议先主动GC(force garbage collection),把达到释放内存条件的对象释放掉。
Dump HPROF file:点击DDMS工具条上面的Dump HPROF文件按钮,选择文件存储位置,然后在运行hprof-conv。可以用MAT分析heap dumps启 动MAT然后加载刚才我们生成的HPROF文件。
这种情况很简单,直接看对话框就知道是哪个应用的问题了。然后再分析该应用是否是因为内存泄露造成的 out of memory对话框。》中介绍的各种方法进行分析,确定是否有内存泄露以及是哪个进程造成的内存泄露。
手机dump.gc文件下的这些hprof文件是什么?能删除吗
它保存为一种叫做HPROF的二进制格式。对于Android执行android.os.Debug.dumpHprofData(hprofPath)方法后所生成的文件,需要把.hprof文件从Dalvik格式转换成J2SE HPROF格式。使用AndroidSDK提供的hprof-conv工具可执行该转换操作。
可以去github上搜会检测应用的内存回收情况,如果发现有垃圾对象没有被回收,就会去分析当前的内存快照,也就是上边MAT用到的.hprof文件,找到对象的引用链,并显示在页面上。
GC_HPROF_DUMP_HEAP创建HPROF文件来分析应用时触发的垃圾回收。GC_EXPLICIT显式垃圾回收,例如当调用 gc()(应该避免手动调用而是要让垃圾回收器在需要时主动调用)时会触发。
-XX:+HeapDumpOnOutOfMemoryError,当应用抛出OutOfMemoryError时生成dump文件。使用hprof。启动虚拟机加入-Xrunhprof:head=site,会生成java.hprof.txt文件。该配置会导致jvm运行非常的慢,不适合生产环境。
b) 会在/data/misc目录下生成一个以pidXXX.hprof结尾的hprof文件。c) 然后通过adb pull或其他方式将这个文件导出来即可。
步骤对应用随便操作后,回到一开始的界面,先多触发几次GC ,点击下图的图标(Cause Gc)来主动触发GC,然后再次点击 Dump Hprof File 图标来获取堆文件。
到此,以上就是小编对于android hprof的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位老师在评论区讨论,给我留言。
版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本站联系的,一经查实,本站将立刻删除。