没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
2017/1/7 常见的八种导致APP内存泄漏的问题
http://blog.nimbledroid.com/2016/05/23/memoryleakszh.html 1/6
常见的八种导致 APP 内存泄漏的问题
Nobody likes sluggish mobile apps.
At NimbleDroid, we’re building
cutting-edge tools to redefine how
developers craft performant apps.
Our product is based on patent-
pending technology created at
Columbia University. It provides
automated, comprehensive
performance analysis for every
build of your app. Located in New
York City, our team includes
academics and hackers of all
stripes, from CS PhDs to developers
with 2,000+ stars on GitHub.
即刻使用NimbleDroid优化App!
English | 中文
By
像 Java 这样具有垃圾回收功能的语言的好处之一,就是程序员无需手动管理内存分配。这减少了段错误(segmentation
fault)导致的闪退,也减少了内存泄漏导致的堆空间膨胀,让编写的代码更加安全。然而,Java 中依然有可能发生内存泄
漏。所以你的安卓 APP 依然有可能浪费了大量的内存,甚至由于内存耗尽(OOM)导致闪退。
传统的内存泄漏是由忘记释放分配的内存导致的,而逻辑上的内存泄漏则是由于忘记在对象不再被使用的时候释放对其的引
用导致的。如果一个对象仍然存在强引用,垃圾回收器就无法对其进行垃圾回收。在安卓平台,泄漏 Context 对象问题尤其
严重。这是因为像 Activity 这样的 Context 对象会引用大量很占用内存的对象,例如 View 层级,以及其他的资源。如果
Context 对象发生了内存泄漏,那它引用的所有对象都被泄漏了。安卓设备大多内存有限,如果发生了大量这样的内存泄
漏,那内存将很快耗尽。
如果一个对象的合理生命周期没有清晰的定义,那判断逻辑上的内存泄漏将是一个见仁见智的问题。幸运的是,activity 有
清晰的生命周期定义,使得我们可以很明确地判断 activity 对象是否被内存泄漏。onDestroy() 函数将在 activity 被销毁时调
用,无论是程序员主动销毁 activity,还是系统为了回收内存而将其销毁。如果 onDestroy 执行完毕之后,activity 对象仍被
heap root 强引用,那垃圾回收器就无法将其回收。所以我们可以把生命周期结束之后仍被引用的 activity 定义为被泄漏的
activity。
Activity 是非常重量级的对象,所以我们应该极力避免妨碍系统对其进行回收。然而有多种方式会让我们无意间就泄露了
activity 对象。我们把可能导致 activity 泄漏的情况分为两类,一类是使用了进程全局(process-global)的静态变量,无论
APP 处于什么状态,都会一直存在,它们持有了对 activity 的强引用进而导致内存泄漏,另一类是生命周期长于 activity 的
线程,它们忘记释放对 activity 的强引用进而导致内存泄漏。下面我们就来详细分析一下这些可能导致 activity 泄漏的情
况。
1.
静
态
Activity
泄漏 activity 最简单的方法就是在 activity 类中定义一个 static 变量,并且将其指向一个运行中的 activity 实例。如果在
activity 的生命周期结束之前,没有清除这个引用,那它就会泄漏了。这是因为 activity(例如 MainActivity) 的类对象是静
态的,一旦加载,就会在 APP 运行时一直常驻内存,因此如果类对象不卸载,其静态成员就不会被垃圾回收。
void setStaticActivity
()
{
activity
=
this
;
}
View saButton
=
findViewById
(
R
.
id
.
sa_button
);
saButton
.
setOnClickListener
(
new View
.
OnClickListener
()
{
@Override public void onClick
(
View v
)
{
setStaticActivity
();
nextActivity
();
}
});
内存泄漏场景 1 - Static Activity
2.
静
态
View
另一种类似的情况是对经常启动的 activity 实现一个单例模式,让其常驻内存可以使它能够快速恢复状态。然而,就像前文
所述,不遵循系统定义的 activity 生命周期是非常危险的,也是没必要的,所以我们应该极力避免。
Tom Huzij | Piasy 译
May 23, 2016
关于我们
文章分类
All
Performance Tips
NimbleDroid Insights
Company
您可能也会对此感兴趣
Performance Problems In
Libraries And SDKs
25 Apr 2016
Return to nimbledroid.com
郑瑜伊
- 粉丝: 19
- 资源: 318
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0