Android 检测内存泄漏方法总结

Memory Monitor

使用Memory Monitor实时获取应用内存使用情况,当内存使用增长到一定程度时会触发GC,此时Monitor中显示的内存使用量会有一定程度的下降,如果下降不明显,肯定发生了内存泄漏。如果随着程序的不断使用,内存增长越来越大,应该进行内存泄漏的查找,避免发生内存溢出。

DDMS工具下的Heap

收集更新关于内存泄漏信息和其他内存相关问题的工具是Android Device Monitor的DDMS工具下的Heap。Heap工具能够通过显示系统为你分配了多少内存来帮助你诊断内存泄漏问题。提供了许多关于应用堆内存使用情况的数据,包含APP内分配的各种对象,分配的对象数量以及这些对象占用了多少空间。(MAT)
Heap输出信息会在GC事件之后,因为你可以手动点击Cause GC来触发GC,使得Heap内存数据尽快显示出来。

内存泄漏检测利器-LeakCanary

LeakCanary就是能自动完成这些内存追踪,检测,输出结果的工具。在测试你的APP时,如果发生了内存泄漏,状态栏上会有通知告诉你,Logcat上也会有相应的log通知你。
在Application中 RefWatcher mRefWatcher=LeakCanary.install(this);用于监控,追踪应用中的对象引用。
原理:API14增加了ActivityLifecycleCallbacks,通过这个callback就可以监控Activity的生命周期。默认情况下LeakCanary会监控和所有Activity的生命周期,并且在Activity的onDestroy函数之后将该Activity添加到内存泄漏监控队列,也就是在RefWatcher.watch()中创建一个KeyedWeakReference到被监控的对象。接下来,在后台线程中检测这个引用是否被清除,如果没有将触发GC。如果引用仍然没有清除,将heap内存dump到一个.hprof文件并存放到手机系统里。HeapAnalyzerService在另外一个独立的进程中启动,使用HeapAnalyzer解析heap内存,HeapAnalyzer计算出到GC ROOTS的最短强引用路径来决定是否发生Leak,然后建立导致内存泄漏的引用链。结果被回传到应用程序进程的DisplayLeakService中,然后输出log并且显示一个泄漏的消息通知。

你可能感兴趣的:(Android)