为什么会产生内存泄漏?

当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏。

内存泄漏对程序的影响?

内存泄漏是造成应用程序OOM的主要原因之一!我们知道Android系统为每个应用程序分配的内存有限,而当一个应用中产生的内存泄漏比较多时,这就难免会导致应用所需要的内存超过这个系统分配的内存限额,这就造成了内存溢出而导致应用Crash。

一、 Activity 泄漏

1、Activity 泄漏通常是内存泄漏的一种。为什么会泄漏呢?如果你持有一个未使用的 Activity 的引用,其实也就持有了 Activity 的布局,自然也就包含了所有的 View。最棘手的是持有静态引用。别忘了,Activity 和 Fragment 都有自己的生命周期。一旦我们持有了静态引用,Activity 和 Fragment 就不会被垃圾回收器清理掉了。这就是为什么静态引用很危险。

2、如何避免 Activity 泄漏?

  • 移除掉所有的静态引用。
  • 考虑用 EventBus 来解耦 Listener。
  • 记着在不需要的时候,解除 Listener 的绑定。
  • 尽量用静态内部类。
  • 做 Code Review。个人经验:Code Review 能很早的发现内存泄漏。
  • 了解你程序的结构。
  • 用类似 MAT,Eclipse Analyzer,LeakCanary 这样的工具分析内存。
  • 在 Callback 里打印 Log。

二、滑动

实现流畅滑动的技巧:UI 线程只用作 UI 渲染。这一条真谛能够解决 99% 的滑动卡顿问题。不要在 UI 线程做下面的事情:

  • 载入图片
  • 网络请求
  • 解析 JSON
  • 读取数据库

做这些操作是很慢的,像图片,网络,JSON考虑用现成的库,有很多社区提供的解决方案,数据库考虑下用 Loader,支持批量更新和载入

参考文档 Android memory profiler的使用