内存泄漏:是指内存得不到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

  • 不要在匿名内部类中进行异步操作
  • 使用静态匿名内部类

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

Android内存泄漏杂谈的更多相关文章

  1. 【转】android 内存泄漏相关收藏博客。

    关于android内存泄漏的研究   博客建了几个月,都没有去写,一是因为当时换工作,然后又是新入职(你懂的,好好表现),比较忙:二是也因为自己没有写博客的习惯了.现在还算是比较稳定了,加上这个迭代基 ...

  2. 关于android内存泄漏的研究

    博客建了几个月,都没有去写,一是因为当时换工作,然后又是新入职(你懂的,好好表现),比较忙:二是也因为自己没有写博客的习惯了.现在还算是比较稳定了,加上这个迭代基本也快结束了,有点时间来写写博客.好了 ...

  3. Android内存泄漏的各种原因详解

    转自:http://mobile.51cto.com/abased-406286.htm 1.资源对象没关闭造成的内存泄漏 描述: 资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我 ...

  4. Android 内存泄漏优化汇总

    android内存泄漏优化摘要 博客分类: android android内存溢出OutOfMemoryError . android移动应用程序的内存分配一般是8凯瑟琳约,不正确地假定处理内存处理非 ...

  5. Android内存泄漏检测利器:LeakCanary

    Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...

  6. Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  7. [Android]Android内存泄漏你所要知道的一切(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/7235616.html Android内存泄漏你所要知道的一切 ...

  8. LeakCanary 来检查 Android 内存泄漏

    LeakCanary 来检查 Android 内存泄漏

  9. Android内存泄漏的检测流程、捕捉以及分析

    https://blog.csdn.net/qq_20280683/article/details/77964208 Android内存泄漏的检测流程.捕捉以及分析 简述: 一个APP的性能,重度关乎 ...

随机推荐

  1. Java 浮点数精度丢失

    Java 浮点数精度丢失 问题引入 昨天帮室友写一个模拟发红包抢红包的程序时,对金额统一使用的 double 来建模,结果发现在实际运行时程序的结果在数值上总是有细微的误差,程序运行的截图: 输入依次 ...

  2. BZOJ.3170.[TJOI2013]松鼠聚会(切比雪夫距离转曼哈顿距离)

    题目链接 将原坐标系每个点的坐标\((x,y)\)变为\((x+y,x-y)\),则原坐标系中的曼哈顿距离等于新坐标系中的切比雪夫距离. 反过来,将原坐标系每个点的坐标\((x,y)\)变为\((\f ...

  3. 2017-9-17-MDIO信号线串联小电阻作用【转】

    今天做集成测试的时候被领导说测到的MDIO信号过冲较大(正反向过冲都很大),容易损坏接口或阻容,万一那个电容耐压值不够就挂了. 我原本是不屑的,私以为MDIO.IIC.SPI等只要抓到的波形不影响判决 ...

  4. 英语口语练习系列-C32-建筑-述说时间-暮秋独游曲江

    词汇-building(建筑) entertainment Olympic-sized swimming pool tennis court basketball field football pit ...

  5. 英语口语练习系列-C25-冒险-课堂用语-葬我

    词汇-冒险 adventure noun [ C or U ] UK /ədˈven.tʃər/ US /ədˈven.tʃɚ/ an unusual, exciting, and possibly ...

  6. LeetCode(169. 求众数)

    问题描述 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] ...

  7. Python一行代码处理地理围栏

    最近在工作中遇到了这个一个需求,用户设定地理围栏,后台获取到实时位置信息后通过与围栏比较,判断是否越界等. 这个过程需要用到数据协议为GEOjson,通过查阅资料后,发现python的shapely库 ...

  8. MySQL环境变量的配置

    找到mysql安装的bin目录下复制此路径: 我的电脑右击属性====>>高级系统设置==>>环境变量 找到path 单击编辑将路径粘贴到变量值的最前面,在bin后面加上英文的 ...

  9. day2_抓包_python基础

    char抓包, 1,作用,定位问题实在前端还是在后端.2.在overview中查看返回码是否正常,一般是200,在看response中是否正常返回数据,可查看请求时间等 2.在sequence视图中的 ...

  10. CentOS 7创建自定义KVM模板(现有KVM迁移到另外一台机)

    说明:创建KVM模板有个好处,不用每次都运行命令创建,并且可以为迁移做准备. 一.创建KVM模板 1.下载iso(省略) 2.创建磁盘 qemu-img create -f raw centos7.r ...