内存泄露的实时监测,表示非常好奇,扫一眼。
原理
- 查找泄露:对所有rootObj(这个是要外部用refWatcher.watch传入的)创建一个带queue的WeakReference。如果这个WR进了queue就肯定没有泄露,强制GC一次,如果WR没有进到queue就有可能有泄露
- 确认泄露:使用Debug.dumpHprofData得到hprof文件,使用MAT解析成一个图。最后遍历图,找到内存泄露中存在的问题引用
合理设计
- 所有依赖平台的部分都封装成interface,靠builder构建一个可运行实例
- 文件
- Executor
- Debug信息(Debug影响内存泄露)
- GC
- HeapDumper
- 尝试查找泄露都要保证queue是空闲的,如果不空闲用指数回退方法进行多次尝试
技巧
- WeakReference构造函数可以传进一个ReferenceQueue,一旦WR被回收,都会放到这个queue里
- MessageQueue可以通过addIdleHandler监听空闲
- 给null一个合理的名字,增加可读性——HeapDumper.RETRY_LATER
- System.gc不如Runtime.gc来的及时——GcTrigger.DEFAULT
- 保证UI事件发生,可以在触发UI事件后,立刻在mainLooper的queue里addIdleHandler来监听——AndroidHeapDumper.dumpHeap
- Debug.dumpHprofData可以输出出hprof文件——AndroidHeapDumper.dumpHeap
- 善用工厂方法——AnalysisResult.failure
- 找路径的算法其实蛮简单的,就是遍历一个图——ShortestPathFinder