内存泄漏:是指内存得不到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并发核心九】并发集合框架

    1.List接口:ArrayList 和 Vector ArrayList不是线程安全的,Vector是线程安全的,Vector有一个子类,可实现后进先出(LIFO)的对象堆栈(LinkedList ...

  2. Java并发编程(六)-- 同步块

    上一节已经讲到,使用Synchronzied代码块可以解决共享对象的竞争问题,其实还有其他的方法也可以避免资源竞争问题,我统称他们为Java同步块.Java 同步块(synchronized bloc ...

  3. ThinkPHP CI codeignitor 框架 apache 重写 url 隐藏index.php 服务器 报错:Object not found! 可能是.htaccess隐藏index.php

    隐藏index.php可以去掉URL地址里面的入口文件index.php,但是需要额外配置WEB服务器的重写规则.以Apache为例,需要在入口文件的同级添加.htaccess文件(官方默认自带了该文 ...

  4. js点击回到顶部2

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>点 ...

  5. 2017-2018 ACM-ICPC Southeast Regional Contest (Div. 1)

    A. Ducks in a Row 当$n\times k>|S|$时,显然无解. 否则最优解中翻转的区间一定两两不相交,设$f[i][j][x][y]$表示考虑前$i$个位置,第$i$个位置翻 ...

  6. BZOJ5057 : 区间k小值5

    整体二分,按时间顺序依次考虑对于权值落在$[l,r]$内的所有操作. 对于每个修改操作,若权值范围完全包含了$[l,r]$,那么在更深层的分治中它都完全包含它,对每个询问的贡献是定值,因此在当前层将贡 ...

  7. 安装 VS2017 的正确姿势

    自从装了长城带宽,我的肠子就变成青色的了. 国内的网络环境,真的是有很大的不同,有的人装 VS 的时候,号称满速,有的人(其实就是我)要等它下载很久,还告诉我有个组件没有安装成功.很久很久以前,VS ...

  8. 【枚举】珠心算测验[c++]

    题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及. 某学校的珠心算老师采用一种快速考察珠心算加 ...

  9. [原创]AndroBugs_Framework Android漏洞扫描器介绍

    [原创]AndroBugs_Framework Android漏洞扫描器介绍 1 AndroBugs_Framework Android 漏洞扫描器简介 一款高效的Android漏洞扫描器,可以帮助开 ...

  10. Visual Studio 2015 没显示可用的.Net Framework版本

    安装了VS 2015企业版, 然后在创建工程的时候遇到了一个问题: 当我选择Framework版本时候, 列表是空的, 如下图所示: 是生成工具出现了问题,所以尝试又安装了下 "Micros ...