最近一次迭代的线上版本中出现了非常多的oom,绝大部分都是华为手机。报错信息如下:
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory
google了一下,大致可以定位到是因为华为的部分rom限制了进程的线程数,超过500个就会oom。自己写了个demo,在荣耀9 Android8.0的机器上不断创建线程,创建大约470个就会报错pthread_create (1040KB stack) failed: Out of memory
。
讲一下我的解决思路:
一、查看当前进程的线程数
adb shell
-
top -m 20
找到进程对应的PID xxx -
ps -T xxx |wc -l
查看xxx进程的线程数
部分手机看不到线程数,如果看不到就换台手机 。。。
二、对比旧版本,查看多了哪些线程
image.png对比了旧版本,多了近20个线程,其中16个线程的名字为
New I/O worker
进入app后不做任何操作,线程数一直在增长,通过命令
ps -T xxx
可以查看到名字为New I/O worker
的线程几分钟就会创建十几个,google关键字New I/O worke thread
后可以知道这个线程应该是netty
创建的,而此次版本迭代集成了第三方aar,aar刚好用到了netty,基本可以断定是第三方aar使用netty不当导致的。
aar是用的3.10.5版本的netty,阅读了netty的源码知道netty在创建的时候会初始化两个线程池,一个boss线程池,一个worker线程池,其中worker线程池会初始化
CPU核心数*2
个线程,而测试机刚好是核心数为8的晓龙845,这刚好与多出来的16个线程吻合。
三、解决
后来要到了第三方aar的源码,对netty创建的代码做了部分修改,避免每次重连的时候创建线程,问题解决。
浪费好长时间,无力吐槽。。。
thanks:
不可思议的OOM
网友评论