现象
进入主页后,静置一段时间后,应用崩溃重启。
静置时的日志表明,应用中的长连接库在不停的进行重连操作,直觉表明,大概率是fd泄漏,或者内存炸了。通过查询Strick Mode日志,未发现有fd泄漏的场景。重复多次后,最终捕捉到了崩溃日志
找到了罪魁祸首,接下来就好说了。我们可以通过三方库,native层hook住所有线程的创建,并输出堆栈,以此查看哪些操作触发了线程的创建。
hook_plt_method("libart.so", "pthread_create", (hook_func) &pthread_create_hook);
经排查发现,长连接库通过netty实现私有tcp协议,重连时调用的netty api姿势存在问题,每次重连时,不断创建线程,同时重连没有次数限制。几分钟内,活生生榨干了资源。
反思
一般的,会要求项目内线程做到统一管理,比如设计通用的i/o,cpu型线程池,并进行复用。同时必要时也可以通过lint等方式扫描项目中存在的野线程,做到编码规范统一。
扩展一下
创建线程需要多少资源?