首先新建两个测试页面A和B,在页面B中通过handler延迟执行runnable任务。使用Android Studio的Profiler定位内存泄漏

使用Android Studio的Profiler定位内存泄漏

运行程序,打开Profiler窗口,点击MEMORY。

使用Android Studio的Profiler定位内存泄漏

使用Android Studio的Profiler定位内存泄漏

由上图可知此时总内存是45.4M。点击页面A按钮跳转到页面B,handler发送延迟执行的消息,然后销毁页面B返回A,点击gc按钮回收后内存如下图,比原先多了几M,说明内存泄漏了。

使用Android Studio的Profiler定位内存泄漏

点击使用Android Studio的Profiler定位内存泄漏按钮,可以看到是页面B的mRunnable对象导致的内存泄漏(如下图)。

使用Android Studio的Profiler定位内存泄漏

为什么会这样?这是因为mRunnabled对象被message引用,而message在消息队列排队,所以runnable对象得不到释放,又因为内部类持有外部类引用,导致页面B得不到释放。解决方案是在B页面销毁的时候移除mRunnable任务即可(如下图)。

使用Android Studio的Profiler定位内存泄漏

相关文章: