Android - 内存泄漏处理

来源:互联网 发布:sql 替换 编辑:程序博客网 时间:2024/05/16 17:23

Memory leak(内存泄漏)

虽然说Java由垃圾回收机制,但是由于代码不规范,编码不成熟,业务逻辑混杂等原因,在使用Java编程的过程中,例如Android应用开发,也会碰到内存泄漏的情况,很多情况下会导致四大组件对象无法回收,对于业务大一点的应用,可能会导致一整个页面内存泄漏。我在工作中也碰到过内存泄漏,记得第一次解决的时候,还是开代码的,后来发现后很多强大的工具,担心太久忘记了,就写下简单的步骤记录下。

Memory leak Analysis Tools

以下将以Android Studio为例,相信大部分的Android开发都已经使用Android Studio了。

Memory Monitor(内存监视器)

Android Studio提供了内存监控和检测的相关工具:
这里写图片描述

默认打开Android Studio后,底部会由几个tab,其中一个Android Profiler(Android Studio 3.0),选中就可以看到上述图片所示的样子。(当然你这时开启一个模拟器,并打开一个应用)
如果在Android Studio面板中没有找到,通过菜单栏-》View-》Tool Windows-》Android Profiler即可打开窗口(Mac)。

Android Profiler显示三个指标数据,CPU,MEMORY,NETWORK,点击对于的指标有惊喜:

这里写图片描述

具体关于Android Profiler工具介绍请看:Android Profiler
注:有机会翻译一把

HPROF Viewer and Analyzer

HPROF文件查看与分析
HPROF具体是什么文件就叙述,直接将如何使用。很明显,内存泄漏是,如果创建了一个Java对象,然后没有及时释放,取消引用,或者在Java虚拟机GC时,发现无法回收该对象,导致内存占用越来越多。怎么确认应用中释放存在内存泄漏呢?当然有工具:Leak Canary,有兴趣的同学可以自行了解,目前项目中就有在用,还是蛮强大的,自动帮你检测。

当工具检测到内存泄漏,或者没有工具时,这时怎么办呢?很显然,开发中一个页面会使用Activity/Fragment,当我们离开这个页面后,发现这个Activity/Fragment还在内存中,说明内存泄漏了,其他对象泄漏也一样。
比如说:制造一个内存泄漏
// TODO

MAT(Memory Analysis Tools)

接下来就讲下MAT内存泄漏分析,是之前的一个例子:
1, 打开Eclipse

这里写图片描述

2, 打开内存分析工具或直接打开HPROF,如果是通过Android Studio获取的文件,需要使用工具转以下,具体后面补充:

这里写图片描述
这里写图片描述
这里写图片描述

原创粉丝点击