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获取的文件,需要使用工具转以下,具体后面补充: