最近一次迭代的線上版本中出現了非常多的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進程的線程數
部分手機看不到線程數,如果看不到就換臺手機 。。。
二、對比舊版本,查看多了哪些線程
對比了舊版本,多了近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