前不久项目遇到了偶现的OOM问题,java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory,并且大部分出现在华为手机上。于是乎谷歌一番,发现华为这些手机的线程数都限制都特别小((应该是华为rom特意修改的limits),每个进程只允许最大同时开500个线程,因此很容易复现了。创建大量的空线程(不做任何事情,直接sleep)当线程数(可以在/proc/pid/status中的threads项实时查看)超过/proc/sys/kernel/threads-max中规定的上限时产生OOM崩溃 OOM时错误信息如下:
W libc : pthread_create failed: clone failed: Out of memory W art : Throwing OutOfMemoryError "pthread_create (1040KB stack) failed: Out of memory" E AndroidRuntime: FATAL EXCEPTION: main Process: com.netease.demo.oom, PID: 4973 java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory at java.lang.Thread.nativeCreate(Native Method) at java.lang.Thread.start(Thread.java:745) ......
知道了是什么原因导致都oom,继续查看log 发现调用栈和RxJava相关,
定位与解决 经过检查代码,发现有个类,会隔10秒就调用一次方法,而方法内会使用rxjava进行线程调度,最后我们看Scheduler.io的原码发现,Scheduler.io会创建一个无上限线程池,而且每个线程设置了一个60s的保活时间防止被结束,会有导致oom的风险。
解决办法:在这种密集频繁的操作时,自己指定一个Executor作为调度器。