`
runfeel
  • 浏览: 935767 次
文章分类
社区版块
存档分类
最新评论

关于android中使用new Message的内存泄露问题

 
阅读更多

我们在android上发消息的时候,使用

后,发现整夜播放系统提示OOM,程序重启。将new Message()换成

后,内存泄露消失。

查了下android的source code,除了测试代码外,基本上都是使用后者方法,没有用前面的方法,确定是new Message泄露了。

继续追了下源码,终于看到问题了。就在Message.java中,可以看到问题的症结:

Message是通过一个message pool(消息池)来存储消息资源的,默认这个池子的大小是10个消息资源。代码片段:

这里可以看到,使用obtain()方法,会从池子里获取一个消息。 当没有可用的空余资源时,new一个。

再看一下,当looper处理完一个消息时,调用的recyle:

这里的意思就是,当looper用完一个消息后,调用recycle,当当前的pool size没达到MAX_POOL_SIZE的时候,将此消息归还给消息池子。

这里看起来也没啥问题,但通篇搜索了google的源代码,也没看到在哪里修改了mPoolSize。如果不改,这个值一直为0,那么不管是通过new Message()还是通过Message.obtain()方法获取的Message,都归还给Message Pool了。通过new出来的message就无法被GC掉,这样就是内存泄露!!

一个可行的修改方法(没测试)

按理说这是一个很小的问题,不知道google为何没修,而是所有的使用上都是通过obtain的方式来实现。是否有何讲究没?

分享到:
评论

相关推荐

    Android中Message机制的灵活应用(二)

    在“Android中Message机制的灵活应用(二)”这个话题中,我们可以继续探索更复杂的用例,如使用`Messenger`或`HandlerThread`进行跨进程通信,或者结合BroadcastReceiver实现更广泛的消息分发。同时,理解Message...

    Android简单Message实例

    如果在子线程中使用`Message`,则需要手动调用`Looper.prepare()`和`Looper.loop()`来启动`Looper`。 在详细博客讲解中,可能会进一步讨论`Handler`的`post(Runnable r)`方法,它也可以用来在UI线程执行任务,但与`...

    解决Android使用Handler造成内存泄露问题

    Android中使用Handler可能会造成内存泄露的问题,这是因为Handler对象会隐式地持有一个外部类对象的引用,使得Activity无法被回收。这种情况下,出现了内存泄露的问题,可能会导致OOM(内存溢出),程序出错。 一、...

    Android内存泄漏解决方案

    通过以上步骤,我们可以有效地识别并解决Android应用中的内存泄漏问题。利用MAT插件和其他工具,开发者能够更精确地定位问题所在,并采取相应的措施进行优化。合理地管理内存不仅可以提升应用的性能,还能增强用户...

    Android内存泄漏总结1

    Android内存泄漏是开发者必须关注的重要问题,因为它直接影响到应用的性能和用户体验。内存泄漏指的是本应被释放的对象由于某种原因仍然被持有,导致垃圾收集器(GC)无法回收这些资源,从而占用宝贵的内存空间。本文...

    Android_内存泄漏研究及调试.doc )

    即使查询的结果集较小,在短时间内可能不会引起明显的内存问题,但如果频繁执行查询操作而不释放资源,最终会导致内存占用过高。 **示例代码**: ```java Cursor cursor = getContentResolver().query(uri, ...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    在Android中,如果一个对象被非静态内部类引用,而这个内部类又被一个长时间存在的对象(如Activity)持有,即使Activity已经不再使用,由于这个引用关系,Activity也无法被垃圾回收,从而造成内存泄漏。 为了解决...

    Android中Handler引起的内存泄露问题解决办法

    在Android开发中,内存泄露是一个严重的问题,因为它会导致应用程序占用过多的内存,影响用户体验甚至导致应用崩溃。在本文中,我们将深入探讨一个特定的内存泄露场景:由Handler引起的内存泄露,以及如何解决这个...

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

    Android 中使用 Handler 造成内存泄露的原因 在 Android 中使用 Handler 时,会像如上那样定义,但是 AS 的 lint 检测会自动报错警告提示。当使用内部类(包括匿名类)来创建 Handler 的时候,Handler 对象会隐式地...

    AndroidHandler内存泄漏详解及其解决方案.docx

    在Android开发过程中,经常会遇到一个令人头疼的问题——内存泄漏,这往往会导致应用程序出现OutOfMemoryError (OOM)异常。内存泄漏的一个常见原因是Handler不当使用导致的内存泄漏。 **1.1 例子说明** 假设有一个...

    Android 中Handler引起的内存泄露

    本文将深入探讨Android中Handler引起的内存泄露问题,以及如何避免这些问题。 1. **Handler与内存泄露的关系** 当我们创建一个Handler实例时,它会与当前线程的Looper关联。对于主线程,这个Looper是与应用程序的...

    android中log对象的使用

    在Android开发中,日志(Log)是一种非常重要的工具,用于记录程序运行过程中的信息,帮助开发者追踪和调试代码。Android系统提供了`android.util.Log`类,提供了多种级别的日志输出方法,包括`Log.v()`, `Log.d()`,...

    android中scoket使用案例

    在Android中使用Socket,我们需要引入相关的网络权限。在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 接下来,我们将创建一个简单的...

    Android Handler Looper

    在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制,尤其是在...同时,需要注意的是,过度依赖Handler可能导致内存泄漏,因此在不再使用Handler时,记得及时移除引用,防止内存泄露的发生。

    android 中Handler 的几种写法

    通过理解以上知识点,开发者可以灵活地在Android应用中使用`Handler`进行线程间通信,高效地处理异步任务和UI更新。在实际开发中,结合`Handler`、`Looper`、`Thread`以及`Runnable`,可以构建出复杂而稳定的多线程...

    Android AIDL使用例子

    5. 解绑服务:在客户端不再需要服务时,必须调用`unbindService()`方法来释放资源,避免内存泄漏。 在这个"Android AIDL使用例子"中,`MyBinderService`很可能包含了上述所有步骤的实现,展示了如何创建、实现AIDL...

    【Android开发入门】Android线程之Handler

    Handler是Android中处理消息和调度任务的对象,它通常与Looper和Message配合使用,实现线程间的通信。主线程中默认有一个Looper对象,负责接收和分发Message,而Handler则用来发送Message到Looper,从而实现主线程的...

    内存泄露的例子分析1

    内存泄露是Android应用开发中的一个重要问题,它会导致应用性能下降,甚至引发应用程序崩溃。内存泄露通常发生在对象不再被使用但仍然被引用,使得垃圾收集器(GC)无法释放这些资源。本文将深入探讨两个常见的内存...

    Android 优化Handler防止内存泄露

    特别是在 Activity 中使用 Handler 时,如果不正确地处理 Handler,可能会导致 Activity 无法被回收,从而导致内存泄露。 常见的 Handler 用法可能导致内存泄露 在 Activity 中使用 Handler 时,一般都是在 ...

Global site tag (gtag.js) - Google Analytics