Android Dev 课程作业 - 内存泄漏

activity的 static 成员 造成的内存泄漏
static TestView sTextView 由于要setText ,所以持有了一个对 Context
的引用,这使得一旦这个 Activity不在了之后,sTextView 依然会 hold 住 Context
不放,所以即便activity的生命周期结束了,它也不能释放。

Screenshot_2016-04-09-09-40-09_com.github.lzyzsd..png

关于Handler post delay 的内存泄漏

Android Lint 和 LeakCanary都没有检测出来。原因可能是这里并算不上是真正的内存泄漏吧。
用自己的语言说一下对handler内存泄漏的理解

  1. activity中的成员mHandler指向的handler被调用post delay的时候,把一个runable对象放到了当前线程的消息队列中,这个runable是activity一个非静态的内部匿名类对象,设计上因为这个内部类对象它可以访问activity的成员,因此,实现上需要持有一个对activity的强引用。
  2. UI主线程中的message queue 挂上了这个runnable,那么除非该runnable 被使用了,否则它不会从queue中移除。而这个queue是在整个UI线程,也就是整个程序生命周期中都存在的,所以,一个长生命周期的指针指向的本来是短生命周期的对象,也就没法释放。反复多次,会造成内存泄漏。当然这个也不算严格意义上的内存泄漏,因为它毕竟是有机会释放的。

https://techblog.badoo.com/blog/2014/08/28/android-handler-memory-leaks
文章中提供了如下三种解决方法:

- 使用静态内部Handler/Runnable + 弱引用
这种方法的原理其实我现在理解还是模糊的,使用起来也不方便。

- 在onDestory的时候,手动清除Message
相当于把handler直接从message queue中移除了。
这样之前未完成的handler事情就不做了。

- 使用Badoo开发的第三方的 WeakHandler

大量创建新对象
private void startAllocationLargeNumbersOfObjects() {
for (int i = 0; i < 10000; i++) {
Rect rect = new Rect(0, 0, 100, 100);//这段代码创建了多个Rect对象,会造成内存上升,但并不会发生内存泄漏,通过GC可以释放。
//正常情况下这么写代码很少见。一个常见的错误例子是在listview 的getView里面每次都申请一个view而不是复用。
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,659评论 0 8
  • Activity是什么 Activity是四大组件之一,它提供一个界面让用户点击和各种滑动操作 Activity栈...
    叫我吹神阅读 2,701评论 0 4
  • ###集合类泄漏 集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。如果这个集合类是全局性的变...
    RunningTeemo阅读 586评论 0 0
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    apkcore阅读 1,247评论 2 7
  • 大学四年遥遥无期,我们终究是逃不过命运的枷锁。选导师,选题,开题,做作品,写论文,答辩…大学的四年在最后的冲刺时间...
    ZacPason阅读 188评论 3 1