美文网首页
java.lang.OutOfMemoryError: pthr

java.lang.OutOfMemoryError: pthr

作者: Duzzi | 来源:发表于2019-04-08 22:45 被阅读0次

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

相关文章

网友评论

      本文标题:java.lang.OutOfMemoryError: pthr

      本文链接:https://www.haomeiwen.com/subject/pxemiqtx.html