1.分析泄漏的由来
我司的测试部门在日常的自动化测试中,发现了一些内存泄漏的点。其中许多泄漏的原因一眼就能看出,可是也有一些真的发现不了。如图
2.使用Memory Profiler 查看Java堆和内存分配
步骤1:首先打开Android Studio,点击顶部Toolbar 的Profile按钮
指示1.用于强制执行垃圾回收 Event 的按钮。(类似人工执行gc)
指示2.用于捕获堆转储的按钮(堆转储显示在您捕获堆转储时您的应用中哪些对象正在使用内存)这个也是本次重点要用的按钮
指示3.用于记录内存分配情况的按钮。 此按钮仅在连接至运行 Android 7.1 或更低版本的设备时才会显示。
指示4.用于放大/缩小时间线的按钮。
指示5.用于跳转至实时内存数据的按钮。
指示6.Event 时间线,其显示 Activity 状态、用户输入 Event 和屏幕旋转 Event。
指示7.内存使用量时间线
步骤4:根据内存泄漏的情况,执行对应的操作。正常情况操作完成以后,相应对象的GC Root链已经没有了。 步骤5:点击按钮2,捕获堆转储。然后右键点击对应存储的对象,导出相应HPROF格式文件。如图所示
如果需要除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按钮。
搜索你想查看的类,然后在对应的类中右击,选择Merge shortest Paths to Gc roots 再选择 exclude phantom/weak refrecnce 可看到如图所示的调用链,有了这个解决问题就轻松了。
自此,大概的一次Android内存泄漏分析流程结束,写下这个也是为了之后再分析可用。