Thread内存泄漏问题

原创 2016年06月01日 21:56:27

最近开发app做到相册模块,发现反复进入相册的Fragment后,内存不断升高,最后OOM

通过LeakCanary工具定位问题,发现内存泄漏发生在Thread中

logcat如下:

06-01 21:41:24.855 23242-26049/mzh.plantcamera D/LeakCanary: In mzh.plantcamera:1.0:1.
                                                             * mzh.plantcamera.ui.activity.PlantAlbumActivity has leaked:
                                                             * GC ROOT thread mzh.plantcamera.model.impl.PlantAlbumModelImpl$ScanDBThread.this$0 (named 'Thread-6767')
                                                             * references mzh.plantcamera.model.impl.PlantAlbumModelImpl.onScanListener
                                                             * references mzh.plantcamera.Presenter.impl.PlantAlbumPresenterImpl$1.this$0 (anonymous class implements mzh.plantcamera.model.PlantAlbumModel$OnScanListener)
                                                             * references mzh.plantcamera.Presenter.impl.PlantAlbumPresenterImpl.plantAlbumView
                                                             * leaks mzh.plantcamera.ui.activity.PlantAlbumActivity instance

最后查明原因是在Thread中调用Looper.prepare()为线程开启自己的消息循环,在Looper.loop();之后没有在适当的地方进行quit,导致线程一直没有销毁
从而导致Thread外部类的引用,而外部类的引用最终持有了Activity的引用,导致Activity在退出后没有被销毁,导致内存泄漏
网上查明资料后得知
Looper.loop()之后的代码不会被执行,这个函数内部应该是一个循环,当调用Handler.getLooper().quit()后,loop才会终止。
loop()函数的源码中也能看出需要quit,提示如下:
Run the message queue in this thread. Be sure to call quit() to end the loop

不得不说LeakCanary是神器啊~

一个内存泄漏引发的血案

一个内存泄漏引发的血案-Square 原文链接 : A small leak will sink a great ship 原文作者 : Pierre-Yves Ricau 译文出自...
  • u012464435
  • u012464435
  • 2016年03月01日 18:08
  • 1326

关于DB组件造成的内存泄露问题解析及解决

系统最近新上一个版本,跑全量初始化时,一段时间后出现OOM异常。当时我们第一反应是排查本版本相对上一版本的改动点,以及实现方式是否有问题。     经业务场景分析,全量计算方式相对上一版本,总体思路没...
  • aa6408323
  • aa6408323
  • 2017年02月14日 09:56
  • 363

内存泄漏之thread浅析

今天工作碰到一个问题,一个留言界面要实现实时聊天。 我思路是开启一个线程,每隔1s就调用一次拿取聊天信息的接口,写个while语句。 一开始,我没有考虑到控制这个while的条件,我发现我退出这个...
  • qq_16692517
  • qq_16692517
  • 2016年05月27日 15:35
  • 635

Android中使用Thread造成内存泄露的分析和解决

Thread 内存泄露线程也是造成内存泄露的一个重要的源头。线程产生内存泄露的主要原因在于线程生命周期的不可控。看一下下面是否存在问题 public class ThreadActivity e...
  • jdsjlzx
  • jdsjlzx
  • 2016年05月13日 00:08
  • 5483

在Activity中使用Thread导致的内存泄漏

原文链接 : Activitys, Threads, & Memory Leaks原文作者 : AlexLockwood译文出自 : 开发技术前线 www.devtf.cn译者 : chaossss校...
  • THEONE10211024
  • THEONE10211024
  • 2015年05月11日 16:21
  • 1539

Java语言中是否存在内存泄漏的问题

Java语言中是否存在内存泄漏的问题
  • jsqfengbao
  • jsqfengbao
  • 2015年03月31日 22:26
  • 982

snmp++ 3.2.23中的内存泄漏

在log.h 中static AgentLog* log()    { if (!instance) init(new AgentLogImpl()); return instance; }分配的in...
  • hjy82919
  • hjy82919
  • 2009年04月02日 11:31
  • 931

JAVA内存泄漏问题处理方法经验总结

JVM问题,一般会有三种情况,目前遇到了两种,线程溢出和JVM不够用   1.线程溢出:unable to create new native thread 1.1问题描述: 系统在1...
  • only_jing1314
  • only_jing1314
  • 2016年03月26日 14:26
  • 1310

匿名内部类引起的内存泄露——Handler和Thread

匿名内部类会持有外部类的引用,当内部类进行延时操作的时候,如果外部类是Activity,那么在执行destroy后,并不会被销毁,从而导致内存泄漏...
  • bigbangwqf
  • bigbangwqf
  • 2016年05月06日 13:23
  • 1658

Android App 内存泄露之Thread

Thread 内存泄露 线程也是造成内存泄露的一个重要的源头。线程产生内存泄露的主要原因在于线程生命周期的不可控。 1.看一下下面是否存在问题 public class ThreadActivity...
  • zhuanglonghai
  • zhuanglonghai
  • 2014年07月17日 17:15
  • 6827
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Thread内存泄漏问题
举报原因:
原因补充:

(最多只允许输入30个字)