转自:http://www.linuxidc.com/Linux/2011-10/44785.htm

因为Android使用Java作为开发语言,很多人在使用会不注意内存的问题。

于是有时遇到程序运行时不断消耗内存,最终导致OutOfMemery,程序异常退出,这就是内存泄露导致的。

我们现在就来总结一下可能导致内存泄露的情况:

    1. 查询数据库而没有关闭Cursor

      Android中,Cursor是很常用的一个对象,但在写代码是,经常会有人忘记调用close, 或者因为代码逻辑问题状况导致close未被调用。

       

      通常,在Activity中,我们可以调用startManagingCursor或直接使用managedQuery让Activity自动管理Cursor对象。
      但需要注意的是,当Activity介绍后,Cursor将不再可用!
      若操作Cursor的代码和UI不同步(如后台线程),那没需要先判断Activity是否已经结束,或者在调用OnDestroy前,先等待后台线程结束。

      除此之外,以下也是比较常见的Cursor不会被关闭的情况:

      1. try {
      2. Cursor c = queryCursor();
      3. int a = c.getInt(1);
      4. ......
      5. c.close();
      6. catch (Exception e) {
      7. }

      虽然表面看起来,Cursor.close()已经被调用,但若出现异常,将会跳过close(),从而导致内存泄露。

      所以,我们的代码应该以如下的方式编写:

      1. Cursor c = queryCursor();
      2. try {
      3. int a = c.getInt(1);
      4. ......
      5. catch (Exception e) {
      6. finally {
      7. c.close(); //在finally中调用close(), 保证其一定会被调用
      8. }
    2. 调用registerReceiver后未调用unregisterReceiver().

      在调用registerReceiver后,若未调用unregisterReceiver,其所占的内存是相当大的。
      而我们经常可以看到类似于如下的代码:

      1. registerReceiver(new BroadcastReceiver() {
      2. ...
      3. }, filter); ...

      这是个很严重的错误,因为它会导致BroadcastReceiver不会被unregister而导致内存泄露。

    3. 未关闭InputStream/OutputStream

      在使用文件或者访问网络资源时,使用了InputStream/OutputStream也会导致内存泄露

    4. Bitmap使用后未调用recycle()

      根据SDK的描述,调用recycle并不是必须的。但在实际使用时,Bitmap占用的内存是很大的,所以当我们不再使用时,尽量调用recycle()以释放资源。

    5. Context泄露

      这是一个很隐晦的内存泄露的情况。
      先让我们看一下以下代码:

      1. private static Drawable sBackground;
      2. @Override
      3. protected void onCreate(Bundle state) {
      4. super.onCreate(state);
      5. TextView label = new TextView(this);
      6. label.setText("Leaks are bad");
      7. if (sBackground == null) {
      8. sBackground = getDrawable(R.drawable.large_bitmap);
      9. }
      10. label.setBackgroundDrawable(sBackground);
      11. setContentView(label);
      12. }

      在这段代码中,我们使用了一个static的Drawable对象。
      这通常发生在我们需要经常调用一个Drawable,而其加载又比较耗时,不希望每次加载Activity都去创建这个Drawable的情况。
      此时,使用static无疑是最快的代码编写方式,但是其也非常的糟糕。
      当一个Drawable被附加到View时,这个View会被设置为这个Drawable的callback (通过调用Drawable.setCallback()实现)。
      这就意味着,这个Drawable拥有一个TextView的引用,而TextView又拥有一个Activity的引用。
      这就会导致Activity在销毁后,内存不会被释放。

Android下常见的内存泄露 经典的更多相关文章

  1. 谈谈.NET中常见的内存泄露问题——GC、委托事件和弱引用

    其实吧,内存泄露一直是个令人头疼的问题,在带有GC的语言中这个情况得到了很大的好转,但是仍然可能会有问题.一.什么是内存泄露(memory leak)?内存泄露不是指内存坏了,也不是指内存没插稳漏出来 ...

  2. JavaScript 中 4 种常见的内存泄露陷阱

    了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...

  3. .NET中常见的内存泄露问题——GC、委托事件和弱引用

    一.什么是内存泄露(memory leak)? 内存泄露不是指内存坏了,也不是指内存没插稳漏出来了,简单来说,内存泄露就是在你期待的时间内你程序所占用的内存没有按照你想象中的那样被释放. 因此什么是你 ...

  4. 对开发中常见的内存泄露,GDI泄露进行检测

    对开发中常见的内存泄露,GDI泄露进行检测 一.GDI泄露检测方法: 在软件测试阶段,可以通过procexp.exe 工具,或是通过任务管理器中选择GDI对象来查看软件GDI的对象是使用情况. 注意点 ...

  5. 分享.net常见的内存泄露及解决方法

    分享.net常见的内存泄露及解决方法 关于内存泄漏的问题,之前也为大家介绍过,比如:<C++中内存泄漏的检测方法介绍>,是关于C++内存泄漏的.今天为大家介绍的是关于.NET内存泄漏的问题 ...

  6. JavaScript 中常见的内存泄露陷阱(摘)

    内存泄露是每个开发者最终都不得不面对的问题.即便使用自动内存管理的语言,你还是会碰到一些内存泄漏的情况.内存泄露会导致一系列问题,比如:运行缓慢,崩溃,高延迟,甚至一些与其他应用相关的问题. 什么是内 ...

  7. Android使用Handler造成内存泄露的分析及解决方法

    一.什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用 ...

  8. Android handler 可能会造成内存泄露

    Android handler 可能会造成内存泄露 Android Studio 使用 Handler 时: private Handler handler = new Handler(){ @Ove ...

  9. Android中常见的内存泄漏

    为什么会产生内存泄漏? 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. ...

随机推荐

  1. Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0.jar的问题

    今天往STS工具中导入一个maven项目,导入后发现pom.xml文件的<dependency>处报错:Missing artifact com.oracle:ojdbc14:jar:10 ...

  2. 洛谷P3413 SAC#1 - 萌数(数位dp)

    题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...

  3. BZOJ 2725 [Violet 6]故乡的梦 线段树+最短路树

    \(\color{#0066ff}{ 题目描述 }\) \(\color{#0066ff}{输入格式}\) \(\color{#0066ff}{输出格式}\) \(\color{#0066ff}{输入 ...

  4. HackerRank - array-partition 并查集

    https://vjudge.net/contest/279745#problem/G 每次将质数的倍数放进一个集合中,那么如果最后的集合数为n的话: 方案数: 2^n -2 : #include&l ...

  5. PHP删除目录下的空目录

    function rm_empty_dir($path){       if(is_dir($path) && ($handle = opendir($path))!==false){ ...

  6. vue.js组件之j间的通讯一 子组件接受父祖件数据

    Vue2.0的三种常用传值方式.父传子.子传父.非父子组件传值 在Vue的框架开发的项目过程中,经常会用到组件来管理不同的功能,有一些公共的组件会被提取出来.这时必然会产生一些疑问和需求?比如一个组件 ...

  7. java 柱状图、折线图、饼状图

    1.绘制柱状图: //BarChartTool工具类代码 package GUIview; import HibernateTool.HibernateTools; import ProductCla ...

  8. Til the Cows Come Home (dijkstra算法)

    Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before ...

  9. vue(5)联动+tab页

    来自:https://juejin.im/post/5a0c191f6fb9a04514639419 1.联动 新增 <input v-model="msg" /> & ...

  10. 用sphinx-doc优雅的写文档

    Sphinx 是一个工具,它使得创建一个智能而美丽的文档变得简单.作者Georg Brandl,基于BSD许可证. 起初为写 Python 文档而诞生的 Sphinx,支持为各种语言生成软件开发文档. ...