转自: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在销毁后,内存不会被释放。

转载于:https://www.cnblogs.com/wliangde/p/3712619.html

Android下常见的内存泄露 经典相关推荐

  1. Android下常见的内存泄露

    转自:http://www.linuxidc.com/Linux/2011-10/44785.htm 因为Android使用Java作为开发语言,很多人在使用会不注意内存的问题. 于是有时遇到程序运行 ...

  2. Android中常见的内存泄露

    内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏.内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会 ...

  3. Android开发中常见的内存泄露案例以及解决方法总结

    Android开发中常见的内存泄露案例以及解决方法总结 参考文章: (1)Android开发中常见的内存泄露案例以及解决方法总结 (2)https://www.cnblogs.com/shen-hua ...

  4. java内部类内存泄漏,Android中常见的内存泄漏和解决方案

    什么是内存泄漏? 简单点说,就是指一个对象不再使用,本应该被回收,但由于某些原因导致对象无法回收,仍然占用着内存,这就是内存泄漏. 为什么会产生内存泄漏,内存泄漏会导致什么问题? 相比C++需要手动去 ...

  5. Android面试题目(10) 内存泄露

    android 中内存开发,需要很多内存泄漏的问题.最根本的原因是对象不该被GCRoots引用,可是对象被GCRoots引用到了,下面是常见的内存泄露问题: 1.InputManager 引起内存泄露 ...

  6. Android性能优化(1) 内存泄露 amp; 解决方案

    前言 在Android中,内存泄露的现象十分常见:而内存泄露导致的后果会使得应用Crash 本文 全面介绍了内存泄露的本质.原因 & 解决方案,最终提供一些常见的内存泄露分析工具,希望你们会喜 ...

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

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

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

    Android使用Handler造成内存泄露的分析及解决方法 参考文章: (1)Android使用Handler造成内存泄露的分析及解决方法 (2)https://www.cnblogs.com/xu ...

  9. 常见造成内存泄露的原因

    内存泄露造成原因 1.上下文对象 2.碎片 3.WindowManager等系统管理类 4.Map 5.List和Map類似 6.接口回调 7.View 8.handler 9.线程 10.第三方库 ...

最新文章

  1. 数组--将两个有序数组a,b合并成新的有序数组c
  2. Office for AI | 拯救互联网人崩溃瞬间
  3. 漫说单例模式--宝宝成长记 你真的了解了吗?
  4. nginx websocket proxy
  5. 《ASP.NET Core 微服务实战》-- 读书笔记(第11章)
  6. 5码默认版块_5个小众的生活学习类的宝藏App
  7. xy坐标正负方向_【笛卡尔坐标系】
  8. jqxWidgets 常用代码
  9. 坑了腾讯1624万!3人冒充老干妈员工诈骗腾讯 判决结果来了...
  10. Smart Client Software Factory 初试
  11. PX4 SITL Gazebo 仿真时 libgazebo_multirotor_base_plugin 插件运行时出错
  12. python可以写前端吗_哪种ide能同时写java和前端代码?
  13. 云优后台提交显示parsererror_Web测试必备技能——F12定位bug属于前端还是后台
  14. Python编程PTA题解——输出星期名缩写
  15. 基于java火车购票系统
  16. ECDH_SECP256R1 + X9.63 KDF-SHA256
  17. arduino控制小车转向_利用XECU和激光雷达快速搭建入门级的自动驾驶小车
  18. 【c语言】C语言运动会系统
  19. CleanMyMacX2022苹果mac电脑应用软件
  20. Oracle 访问SQL Server的数据 (通过Oracle gataway)

热门文章

  1. 在Javascript中实现伪哈希表
  2. docker 4 section
  3. 个推应用统计产品(个数)Android集成实践
  4. 收集整理的非常有用的PHP函数
  5. Hadoop--初识Hadoop
  6. OpenXLive 0.9.9 SDK发布,增加对SNS的支持
  7. 设备底座几个常见固定方式
  8. 【精心总结】java内存模型和多线程必会知识
  9. Flask爱家租房--订单支付(支付过程)
  10. php柱状图实现年龄分布,考官雅思写作小作文满分范文 柱状图:年龄分布