IO 泄露

概述

I/O监控,可以监控APP运行时,出现的I/O问题,包括文件主线程I/O,读写buffer太小,重复读,文件句柄未关闭。

检测原理

[图片上传失败...(image-c877a-1604645919078)]

文件I/O监控采用的native hook的方式,通过hook文件操作接口,来收集I/O信息。

文件句柄关闭监控采用的是Android 框架提供的StrictMode。StrictMode有专门针对文件close监控的dalvik.system.CloseGuard模块。只需通过反射机制,打开CloseGuard监控,并动态代理CloseGuard中的Reporter接口,即可监控到文件/句柄未关闭导致的泄露。

以FileInputStream为例,当gc的时候会调用FileInputStream中的finalize方法,其中guard用于标记gc前FileInputStream是否已经调用close关闭句柄。如果gc之前还没有close,调用guard.warnIfOpen。我们通过反射代理guard.warnIfOpen中的REPORTER.report方法获取泄露信息。

[图片上传失败...(image-4f103c-1604645919078)]

[图片上传失败...(image-89d72-1604645919078)]

检测场景

1.主线程IO

耗时的IO操作不能占据主线程太久,当监控到满足以下两个条件,SDK将上报:

1)操作线程为主线程

2)连续读写超过一定阈值(500ms)或单次write/read耗时超过一定阈值 (13ms) [图片上传失败...(image-3ec231-1604645919078)]

2.读写buffer太小

Buffer过小,会导致read/write的次数增多,从而影响性能。监控条件为:

1)Buffer小于一定阈值 (4KB)

2)Read/write的次数超过一定阈值 (20)

3)最大连续读/写时间大于 13ms [图片上传失败...(image-31b63a-1604645919078)]

3.重复读

如果频繁地读某个文件,说明这个文件的内容很常被用到,可以通过缓存来提高效率。监控条件为:

1)文件最大连续读写时间大于13ms(如果文件最大连续读写时间<13ms,就不会加入观察)

2)同一个文件,连续两次读操作间隔小于17ms

3)同一线程读取某个文件的次数超过一定阈值(5次)(这里要求读取的文件路径,堆栈,线程,文件大小等信息均一样)

4.文件句柄关闭泄漏监控:

文件句柄关闭泄漏指的是打开资源包括文件/cursor等,没有及时close,引起泄露。SDK检测到文件open之后没有对应的close,将会上报泄漏。 [图片上传失败...(image-dc85a8-1604645919078)]

你可能感兴趣的:(IO 泄露)