我们在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的方式来实现。是否有何讲究没?

更多相关文章

  1. android设置主题和自定义主题的方法
  2. Android(安卓)中需要掌握的高级技巧
  3. Android数据库操作
  4. (4.1.21.4)Android(安卓)Handler 异步消息处理机制的妙用 创建强大
  5. Android应用程序线程消息循环模型分析
  6. G1安装android软件方法 (实机运行)
  7. Android中应用界面主题Theme使用方法和页面定时跳转应用
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. 常用的 tailwindcss 模板站点
  2. 如果使用的库不支持异步,可以使用多进程并
  3. 【linux】循序渐进学运维-基础篇-yum管理
  4. 网页字体更清晰的css用什么?
  5. css实现垂直居中的方式
  6. 【linux】循序渐进学运维-基础篇-操作系
  7. 【linux】循序渐进学运维-基础篇-磁盘加
  8. 在Linux中创建 本地yum源
  9. css 中的 content-visitly 提升渲染性能
  10. css的cursor样式