您的位置:首页 > 移动开发 > Android开发

Android内存泄漏的避免方法

2016-12-23 10:14 239 查看
参考此链接,http://www.androidchina.net/6130.html

Android内存泄漏主要有六大原因:

1、未及时关闭资源,如游标cursor。

2、构造Adapter时,没有使用convertView。

3、Bitmap对象不使用时候没有使用recycle()释放内存。

4、使用Application的context替代Activity的context。

5、注册没取消造成的泄漏。

一般内存泄漏(traditional memory leak)的原因是:当该对象的所有引用都已经释放了,对象仍未被释放。(如:Cursor忘记关闭等)

逻辑内存泄漏(logical memory leak)的原因是:当应用不再需要这个对象,当仍未释放该对象的所有引用。

参考:http://www.codeceo.com/article/8-ways-android-memory-overflow.html

6、内部类持有对外部类的强引用:

6.1:内部类的优势之一就是可以访问外部类,不幸的是,导致内存泄漏的原因,就是内部类持有外部类实例的强引用。解决办法就是销毁的时候释放(置空)引用;

6.2:相似地,匿名类也维护了外部类的引用。所以内存泄漏很容易发生,当你在Activity中定义了匿名的AsyncTsk。当异步任务在后台执行耗时任务期间,Activity不幸被销毁了(译者注:用户退出,系统回收),这个被AsyncTask持有的Activity实例就不会被垃圾回收器回收,直到异步任务结束。

6.3:同样道理,定义匿名的Runnable,用匿名类Handler执行。Runnable内部类会持有外部类的隐式引用,被传递到Handler的消息队列MessageQueue中,在Message消息没有被处理之前,Activity实例不会被销毁了,于是导致内存泄漏。

6.4:通过Context.getSystemService(int name)可以获取系统服务。这些服务工作在各自的进程中,帮助应用处理后台任务,处理硬件交互。如果需要使用这些服务,可以注册监听器,这会导致服务持有了Context的引用,如果在Activity销毁的时候没有注销这些监听器,会导致内存泄漏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: