内存泄漏:是指内存得不到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. 大数据小白系列——MR(1)

    一部编程发展史就是一部程序员偷懒史,MapReduce(下称MR)同样是程序员们用来偷懒的工具. 来了一份大数据,我们写了一个程序准备分析它,需要怎么做? 老式的处理方法不行,数据量太大时,所需的时间 ...

  2. Java 浮点数精度丢失

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

  3. Springboot 1.5.x 集成基于Centos7的RabbitMQ集群安装及配置

    RabbitMQ简介 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件). RabbitMQ是一套开源(MPL)的消息队列服务软件,是由LShift提供的一 ...

  4. 进程篇:wait & waitpid

    #include <sys/types.h> /* 提供类型pid_t的定义 */ #include <sys/wait.h> pid_t wait(int *status) ...

  5. 杭电2000----ASCII码排序

    #include<stdio.h> int main() { ]; int i,j,t; while(gets(a)!=NULL) { ; i<; ++i) ; j<-i; + ...

  6. 大道至简第一章Java伪代码

    1.编程的精义//愚公移山public class Yugong{public static void main(String[]args){        while(山没平){           ...

  7. VirtWire 注册教程

    1 首先打开virtwire官方网站 网站地址:戳我 2 如果现实如下图所示,点击红色框中的网址连接.(网页中有Terms of Service可以读) 3 如果网页正常打开,点击“ORDERHOST ...

  8. php 获取读取文件内容

    /*     * 获取文件内容     *      */    public function getLocalFileContents($file)    {        $handle = @ ...

  9. 教你用Windows自带工具给优盘/移动硬盘添加密码

    教你用Windows自带工具给优盘/移动硬盘添加密码 本文中优盘,移动硬盘和分区操作方式一样,为方便描述,下文将只说优盘 优盘成了很多人每天都会用到的工具,有时候自己优盘会存着一些不希望别人看到的文件 ...

  10. Java中类加载过程和对象创建过程

    类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加 ...