在业务结束或者内存接近阈值时,我们只需要及时清理掉不再使用的数据,就能取得不错的内存优化效果。虽然这一方案比较简单,但是我们依然会经常遇到因为数据没有清理干净而导致的内存泄漏问题。问题的主要原因往往是这些数据仍在某些我们没办法有效发现的代码中被使用,比如被某个长生命周期对象持有的Activity、某个so库申请了却没有释放的内存等,从而导致数据没办法被有效地清理干净,最终发生内存泄漏。因此对内存泄漏的检测和治理,是确保我们能够及时清理无用数据从而提升可用内存的保障之一。
这里在示例程序中模拟一个内存泄漏的场景,如图2-1所示。第27行中,主线程持有了JavaLeakActivity,即使JavaLeakActivity退出,主线程在50 000 ms的时间内也不会释放该Activity。
图2-1 模拟内存泄漏场景
示例中是一个很简单的模拟场景,我们通过代码便能明确地知道这里会存在内存泄漏,但是实际项目中的内存泄漏往往非常隐秘,我们很难通过代码直接看出来,所以下面就以这个模拟场景为例,看一看在实际项目中如何分析内存泄漏。
内存泄漏有手动分析和自动分析两种方式,我们先看手动分析方式。