本文主要介绍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操作等等;

更多相关文章

  1. Android NDK: Aborting出现NDK_PROJECT_PATH=null解决方法
  2. Android中用Toast.cancel()方法优化toast内容的显示
  3. 【从头学android】第二个程序同一个Activity中,切换布局时监听器
  4. Android 后台任务(七)内存泄露
  5. JS或TS调用原生Android的方法
  6. 安装Android studio出现'tools.jar' seems to be not in Android
  7. Android 屏幕旋转后防止重新执行onCreate的方法。
  8. 【Android】‘activity supporting action_view is not set as b

随机推荐

  1. Windows系统下配置Android(安卓)NDK开发
  2. Android activity 四个启动模式的作用与
  3. 新手拥抱Android
  4. 如何在Eclipse中调试Launcher源码
  5. Android(安卓)Studio 配置SVN,通过Share p
  6. day4.16总结_消息通讯
  7. Android中自定义Menu
  8. Android 获取并显示远程图片 Picasso框架
  9. AsyncTask的用法
  10. 开源项目之Android(安卓)Afinal框架