解决OutOfMemoryError: unable to create new native thread问题
背景
java.lang.OutOfMemoryError共有8种类型,其中java.lang.OutOfMemoryError: unable to create new native thread是很常见的一种,这类错误通常发生在应用试图创建新线程时。最近测试环境经常出现错误如下:
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:714)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:950)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1368)
at com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.caught(AllChannelHandler.java:65)
可能原因
- 系统内存耗尽,无法为新线程分配内存
- 创建线程数超过了操作系统的限制
解决方案
- 排查应用是否创建了过多的线程
通过jstack确定应用创建了多少线程?超量创建的线程的堆栈信息是怎样的?谁创建了这些线程?一旦明确了这些问题,便很容易解决。步骤如下:
该进程内最耗费CPU的线程pid top -Hp pid
将pid装换成十六进制 printf “%x\n” 21742
最后用jstack查找线程堆栈信息 jstack 21711 | grep 54ee