java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory

最近一次迭代的線上版本中出現了非常多的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

講一下我的解決思路:

一、查看當前進程的線程數

  1. adb shell
  2. top -m 20 找到進程對應的PID xxx
  3. ps -T xxx |wc -l 查看xxx進程的線程數

部分手機看不到線程數,如果看不到就換臺手機 。。。

二、對比舊版本,查看多了哪些線程

對比了舊版本,多了近20個線程,其中16個線程的名字為New I/O worker

image.png

進入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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容