博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android内存泄漏杂谈
阅读量:6642 次
发布时间:2019-06-25

本文共 1886 字,大约阅读时间需要 6 分钟。

内存泄漏:是指内存得不到GC的及时回收,从而造成内存占用过多。从而导致程序Crash,也就是常说的OOM。

一、static
先来看以下一段代码

public class DBHelper {    private static DBHelper db= null;    private DBHelper() {    }    public static DBHelper getInstance(Context context) {        if (bitmapUtils == null) {            synchronized (DBHelper.class) {                if (db== null) {                    db= new db(context,DBNAME);                }            }        }        return db;    }}

这种代码在项目中非经常见。假设大家细致一点。应该能发现问题在那里。

helper中持有了context的应用。而DBHelper是全局的,也就是说,当在一个Activity中使用了DBHelper,即使这个Activity退出了,这个Activity也没法被GC回收。从而造成Activity一直驻留在内存中。

这个解决方式也比較简单,代码例如以下

public class DBHelper {    private static DBHelper db= null;    private DBHelper() {    }    public static DBHelper getInstance(Context context) {        if (bitmapUtils == null) {            synchronized (DBHelper.class) {                if (db== null) {                    db= new db(context.getApplicationContext(),DBNAME);                }            }        }        return db;    }}

仅仅须要把context改成ApplicationContext()即可,由于ApplicationContext本身就是全局的。

二、非静态内部类、Handler
先来看一段代码

private Handler handler = new Handler(){        @Override        public void dispatchMessage(Message msg) {            // 消息处理        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        new Thread(new Runnable() {            @Override            public void run() {                // 耗时操作                handler.sendEmptyMessage(1);            }        }).start();    }

我们知道非静态内部类会持有外部类的引用,此时这里的Handler持有着外部Activity的引用,当我们在Activity的内部类中进行异步耗时操作时,我们的Activity假设此时被finish掉了,而异步任务没有运行结束,这就会导致我们的Activity对象不能及时的被GC回收,从而导致内存问题。

这种问题解决起来也非常easy

  • 不要在匿名内部类中进行异步操作
  • 使用静态匿名内部类
    总结:内存问题大多数都是由于对对象生命周期的不巧当处理造成的。在使用某个对象时。我们须要细致研究对象的生命周期。当处理一些占用内存较大而且生命周期较长的对象时。应用使用软引用对其即可处理。及时关闭不使用的资源。

转载地址:http://kravo.baihongyu.com/

你可能感兴趣的文章
数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件...
查看>>
oracle索引组织表,簇表
查看>>
XSLT之路2---脚本使用
查看>>
2014.12.5 ios实现相册多选操作
查看>>
Expect自动化交互程序
查看>>
jenkins-参数化构建(二)插件:Extended Choice Parameter
查看>>
前端开发规范
查看>>
(SPOJ687,后缀数组)
查看>>
30岁前不要去在乎的29件事
查看>>
数据调用方法
查看>>
在Hadoop中ResourceManager是干什么的?
查看>>
RF开发关键字(四)
查看>>
【HDOJ】3234 Exclusive-OR
查看>>
vue 点击图片显示大图
查看>>
Hadoop基础-Protocol Buffers串行化与反串行化
查看>>
Hadoop生态圈-phoenix(HBase)的索引配置
查看>>
LitJson使用方法
查看>>
Windows 7上安装配置TensorFlow-GPU运算环境
查看>>
【VS2013编译DirectX Tutorials时遇到的错误】FXC : error X3501: 'main': entrypoint not found
查看>>
npm上传vue组件
查看>>