[置顶] android中常见的内存泄露场景
本文主要介绍android中常见的内存泄露的场景:
- 非静态内部类,静态实例化
public class MyActivity extends AppCompatActivity { public static InnerClass innerClass = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); innerClass = new InnerClass(); } class InnerClass { public void doSomeThing() { } }}
这里内部类InnerClass隐式的持有外部类MyActivity的引用,而在MyActivity的onCreate方法中调用了
innerClass = new InnerClass();
这样innerClass就会在MyActivity创建的时候是有了他的引用,而innerClass是静态类型的不会被垃圾回收,MyActivity在执行onDestory方法的时候由于被innerClass持有了引用而无法被回收
使用Handler异步消息通信
在Activity中使用Handler创建匿名内部类会隐式的持有外部Activity对象的引用,当子线程使用Handler暂时无法完成异步任务时,handler对象无法销毁,同时由于隐式的持有activity对象的引用,造成activity对象以及相关的组件与资源文件同样无法销毁,造成内存泄露
具体可以参考:http://blog.csdn.net/qq_23547831/article/details/46881941使用资源文件结束之后未关闭
在使用一些资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于Java虚拟机内,还存在于Java虚拟机外。如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄露。因为有些资源性对象,比如SQLiteCursor(在析构函数finalize(),如果我们没有关闭它,它自己会调close()关闭),如果我们没有关闭它,系统在回收它时也会关闭它,但是这样的效率太低了。因此对于资源性对象在不使用的时候,应该立即调用它的close()函数,将其关闭掉,然后再置为null.在我们的程序退出时一定要确保我们的资源性对象已经关闭。Bitmap使用不当
bitmap对象使用的内存较大,当我们不再使用Bitmap对象的时候一定要执行recycler方法;
虽然,系统能够确认Bitmap分配的内存最终会被销毁,但是由于它占用的内存过多,所以很可能会超过Java堆的限制。因此,在用完Bitmap时,要及时的recycle掉。recycle并不能确定立即就会将Bitmap释放掉,但是会给虚拟机一个暗示:“该图片可以释放了”。一些框架使用了注册方法而未反注册
比如我们时常使用的事件总线框架-EventBus,具体的实现原理可参考:http://blog.csdn.net/qq_23547831/article/details/44102565
当我们需要注册某个Activity时需要在onCreate中:
EventBus.getDefault().register(this);
然后这样之后就没有其他操作的话就会出现内存泄露的情况,因为EventBus对象会是有该Activity的引用,即使执行了改Activity的onDestory方法,由于被EventBus隐式的持有了该对象的引用,造成其无法被回收,这时候我们需要在onDestory方法中执行:
EventBus.getDefault().unregister(this);
- 集合中的一些方法的错误使用
(1)比如List列表静态化,只是添加元素而不再使用时不清楚元素;
(2)map对象只是put,而无remove操作等等;
更多相关文章
- Android NDK: Aborting出现NDK_PROJECT_PATH=null解决方法
- Android中用Toast.cancel()方法优化toast内容的显示
- 【从头学android】第二个程序同一个Activity中,切换布局时监听器
- Android 后台任务(七)内存泄露
- JS或TS调用原生Android的方法
- 安装Android studio出现'tools.jar' seems to be not in Android
- Android 屏幕旋转后防止重新执行onCreate的方法。
- 【Android】‘activity supporting action_view is not set as b