Android 开发者必会的内存泄漏指南

【CSDN 编者按】对于众多 Android 程序员而言,在需求与应用性能之间,主要精力都会放到新需求的开发 。随着项目复杂度的增加,应用性能越来越低,出现各种问题 。程序员们奔波于各种“救火现场”,疲于奔命 。本文作者 Aritra Roy 分享了自己在 Android 应用程序开发过程中所遇以及思考,针对内存泄漏提炼出一套可以应用于开发中的方法论 。也许会让你的开发效率事半功倍 。

Android 开发者必会的内存泄漏指南

文章插图
作者 | Aritra Roy,Android 开发者
译者 | 罗昭成,责编 | 唐小引
封图 | CSDN 付费下载自东方 IC
出品 | CSDN(ID:CSDNnews)
以下为译文:
我们都知道,写一个 Android 的应用很容易,但是要写一个高性能的应用可就不容易了 。以我的个人经验来说,在 App 的开发过程中,主要的精力都会放在新功能、新模块、新组件的开发上 。
开发过程中,看得见的 UI 比看不见的性能更能吸引我们的目光 。所以我强制自己将“优化应用程序(如内存泄漏)”的优先级提高,并养成习惯 。
长期以来,不关注性能,带来了很多的技术债 。经过一年多的努力调整,比起一年前,我有很多的心得体会 。
对于很多开发者来说,内存泄漏都是一个老大难的问题 。关于处理内存泄漏,你有可能会觉得太难,又或是太费时,又或者是觉得完全没有意义 。但我要告诉你的是,事实并非如此 。当你开始处理这些问题的时候,你会发现,这感觉超级棒 。
在本篇文章中,我会以尽可能简单的方式讲解这些问题,即使你是一个初学者,也可以学习到如何构建一个高质量、高性能的应用 。
1.垃圾回收JAVA 是一个非常强大的语言 。在 Android 中,我们几乎不会像 C / C++ 那样,手动分配和释放内存 。因为 Java 会自动清理内存 。
让我们来思考一个问题,如果 Java 内建的垃圾回收系统可以在我们不需要的时候自动回收内存,那我们为什么还需要关心内存呢?是因为垃圾回收机制不够完善吗?
当然不是,Java 垃圾回收机制当然是完善的 。垃圾回收机制是可以正常工作,但是,如果我们的应用程序出现 Bug,导致垃圾回收器不能正常检查出不需要的内存块,就会导致问题 。
总体来说,是我们自己的代码错误导致垃圾回收不可用 。不可否认,垃圾回收机制是 Java 最伟大的设计之一 。
2.关于垃圾回收器在处理内存问题之前,你需要了解垃圾回收器的工作原理 。它的概念非常简单,但在它背后,有着极其复杂的逻辑 。但是你也别担心,我们也只关心一些简单的概念 。
Android 开发者必会的内存泄漏指南

文章插图
如图所示,Android 或者 Java 应用程序都有一个起点,从对象的初始化,并且调用方法 。我们可以认为,这个点就是图中的 "GC Roots" 。有一些对象引用被 GC Roots 直接持有,剩下的则由它们自己创建并持有 。
如此,整个引用链构成了内存树 。垃圾回收器从 GC roots 开始,直接或间接的链接着其它的对象 。当整个遍历结束,还有一些不能被访问到的对象,就是变成了垃圾,这些对象就会被垃圾回收器回收 。
3.内存泄漏到现在,你已经知道了垃圾回收的概念,也知道了垃圾回收在 Android 中是如何管理内存的 。下面,我们将深入研究一下内存泄漏 。
简单来说,内存泄漏是指你的对象已经使用结束,但是它却不能被释放掉 。每个对象在完成它自己的生命周期过后,都需要从内存中清理出来 。但是如果一个对象被另一个对象直接或间接的持有,垃圾回收器不能检查出它已经使用结束 。朋友们,这样子就导致了内存泄漏 。
值得庆幸的是,我们并不需要太担心所有的内存泄漏,因为并不是所有的内存泄漏都是有害的 。有一些内存泄漏是无关痛痒(只泄漏几 KB 的内存),并且,在 Android Framwork 层也会有一些内存泄漏,但是你并不需要去修复,因为它们对 App 的性能影响微乎其微,你可以忽略 。
但是有一些会引起 App 崩溃,或者严重卡顿 。这些都是需要你时刻注意的 。
4.为什么要解决内存泄漏?没有人会想使用一个又慢又占内存的应用 。如果使用一段时间就会崩溃,你的用户也会“崩溃”掉,如果长时间出现这样子的问题,你的用户会毫不犹豫的卸载掉你的应用,并且再也不会使用它 。
Android 开发者必会的内存泄漏指南


推荐阅读