欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java.lang.OutOfMemoryError: unable to create new native thread

程序员文章站 2022-06-13 21:33:59
...

java.lang.OutOfMemoryError: unable to create new native thread
这个异常一般由于两个原因导致的:

1)内存空间不足以满足创建线程所需的stack size
  virtual memory < stack size*the number of threads
2)线程数已达到操作系统的上限
  线程 vs 进程

查看jvm stack size 相关参数:

java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
intx CompilerThreadStackSize                   = 0               {pd product}      
intx ThreadStackSize                           = 1024            {pd product}      
intx VMThreadStackSize                         = 1024            {pd product}  

操作系统进程相关参数:

进程可用最大虚拟内存
ulimit -v
unlimited

最大栈大小
ulimit -s
8192

每个用户可创建最大进程数
ulimit -u
510226

ulimit 命令详细说明

系统支持的最大进程数
cat /proc/sys/kernel/pid_max
32768

共享内存最大线程数
cat /proc/sys/kernel/threads-max
1020452

pid_max threads-max 说明

获取进程id
ps -ef | grep <key word>
查询当前某程序的线程或进程数
pstree -p <pid> | wc -l
查询当前系统已用的线程或进程数
pstree -p | wc -l

pstree详细说明

打印thread dump
由于已经不能创建新的线程,所以使用jstack打印thread dump时会报错,可以使用kill -3 <pid>

# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# An error report file with more information is saved as:
# ******.log

打印thread dump的几种方法

分析thread dump
可以直接看thread dump,也可以借助图形界面工具,更清晰方便些,比如:
http://fastthread.io/

解决问题
下面链接给出了几种不同原因导致异常对应的解决方法,但方法二中只讲了ulimit -u,实际上面提到的几个进程相关的限制参数,都会影响进程的数量。
https://blog.fastthread.io/2016/07/06/troubleshoot-outofmemoryerror-unable-to-create-new-native-thread/

转载于:https://www.jianshu.com/p/b0df25bae79d