leakcanary 拾遗

LeakCanary

1 使用ActivityLifecycleCallbacks 在onActivityDestroyed中启动对内存泄漏的检查

2 跨进程通信直接是startService(intent)的方式,在IntentService中通过调用静态方法启动service,然后handlerIntent就在另外的进程中执行了。

3 一个listview两个adapter,复用。

4 内存泄漏的检查这个runable 是运行在IdleHandler中。leakcanary 有个默认的线程池

5 生成hprof文件采用的Debug.dumpHprofData()这个方法。

6 验证是否内存泄漏时会在出发GC后,找最短的强引用路线。GC用的方法是参考的系统源码,找引用是用的eclipse下的mat包。




引用类型

强引用(StrongReference),默认对象一般为强引用

软引用(SoftReference),当内存空间足够大时相当于强引用,内存不够时通过垃圾回收器(GC)自动回收

弱引用(WeakReference),当GC扫描到该类型的引用时就自己回收

虚引用,相当于没有进行引用,GC可随时回收该类型的引用




BlockCanary

1 通过setMessageLogging()方法给主线程的looper设置print,那么就会每次在loop()方法中分发消息前后会调用打印的方法。

2 在分发之前延迟一个时间发送一个runnable去取样,然后在分发结束取消这个runnable. 时间可以自定义

3 打印卡顿信息包含cpu和函数调用,cpu使用率数据使用的是proc/stat 和proc/xxx/stat 下的。函数调用采用的是Thread.getStackTrace.

4 Thread实现了Runnable接口 ,可以通过setDefaultUncaughtExceptionHandler 这个方法给Thread 设置异常处理handler.

5 对于频繁打印日志的,为了改善性能,可以使用改进的stringbuilder.6 对于view的绘制,handler 是采用viewrootImp(?)的。所以主线程的handler消息队列会分发渲染的事件。



类似的原理还有ANRWatchdog 在主线程的消息队列中计数增长1.然后发送一个runnable,其中计数也增长1,如果两者相差1,则说明没有卡顿。否则说明主线程被阻塞。缺点如果主线程一直被阻塞,就没有办法。

你可能感兴趣的:(leakcanary 拾遗)