记录一次Android内存分析的流程

1.分析泄漏的由来

我司的测试部门在平常的自动化测试中,发现了一些内存泄漏的点。其中许多泄漏的缘由一眼就能看出,但是也有一些真的发现不了。如图android

default
根据这个调用链看不出具体是哪里持有的泄漏致使的,太抽象了,感受中间少了什么。没办法,只能本身一步步还原分析,查找内存泄漏的具体缘由。(内存泄漏测试可以使用APM相关插件)

2.使用Memory Profiler 查看Java堆和内存分配

步骤1:首先打开Android Studio,点击顶部Toolbar 的Profile按钮bash

profileonandroidstudiotoolbar
步骤2:而后在Profile面板的左上角选择要监控的进程
sessionsinprofile
选好之后会展现如图所示的Profile面板,其中包括内存,CPU,网络等实时监控的内容。
memoryinprofile
步骤3:因为此次主要是查看内存泄漏,因此单击Memory,查看Memory相关的实时监控。这个时候会看到如图所示的界面。
memory-profiler-callouts_2x
简单介绍以下:

指示1.用于强制执行垃圾回收 Event 的按钮。(相似人工执行gc)网络

指示2.用于捕获堆转储的按钮(堆转储显示在您捕获堆转储时您的应用中哪些对象正在使用内存)这个也是本次重点要用的按钮session

指示3.用于记录内存分配状况的按钮。 此按钮仅在链接至运行 Android 7.1 或更低版本的设备时才会显示。eclipse

指示4.用于放大/缩小时间线的按钮。工具

指示5.用于跳转至实时内存数据的按钮。测试

指示6.Event 时间线,其显示 Activity 状态、用户输入 Event 和屏幕旋转 Event。spa

指示7.内存使用量时间线插件

步骤4:根据内存泄漏的状况,执行对应的操做。正常状况操做完成之后,相应对象的GC Root链已经没有了。 步骤5:点击按钮2,捕获堆转储。而后右键点击对应存储的对象,导出相应HPROF格式文件。如图所示 3d

exportheapdump

若是须要除Android Studio的其它HPROF分析器查看文件(我选择的是Memory Analyzer(MAT),下载地址为:www.eclipse.org/mat/), 首先须要将 HPROF 文件从 Android 格式转换为 Java SE HPROF 格式。 您 可使用 android_sdk/platform-tools/ 目录中提供的 hprof-conv 工具执行此操做。 运行包括如下两个参数的 hprof-conv 命令:heap-original.hprof(原始 HPROF 文件)和heap-converted.hprof(转换后 HPROF 文件)。 例如:

hprof-conv heap-original.hprof heap-converted.hprof
复制代码

步骤6:转换完格式之后在mat应用中打开对应的文件,同时选择Histogram按钮。

histogram

搜索你想查看的类,而后在对应的类中右击,选择Merge shortest Paths to Gc roots 再选择 exclude phantom/weak refrecnce 可看到如图所示的调用链,有了这个解决问题就轻松了。

gc root

自此,大概的一次Android内存泄漏分析流程结束,写下这个也是为了以后再分析可用。

参考连接:developer.android.com/studio/prof…
相关文章
相关标签/搜索