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

926 阅读3分钟

1.分析泄漏的由来

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

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

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

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

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

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

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

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

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

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

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

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

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

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…