java.lang.OutOfMemoryError: unab

2018-07-18  本文已影响0人  牛逼的二进制

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/

上一篇下一篇

猜你喜欢

热点阅读