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
系统支持的最大进程数
cat /proc/sys/kernel/pid_max
32768
共享内存最大线程数
cat /proc/sys/kernel/threads-max
1020452
获取进程id
ps -ef | grep <key word>
查询当前某程序的线程或进程数
pstree -p <pid> | wc -l
查询当前系统已用的线程或进程数
pstree -p | wc -l
打印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,也可以借助图形界面工具,更清晰方便些,比如:
http://fastthread.io/
解决问题
下面链接给出了几种不同原因导致异常对应的解决方法,但方法二中只讲了ulimit -u,实际上面提到的几个进程相关的限制参数,都会影响进程的数量。
https://blog.fastthread.io/2016/07/06/troubleshoot-outofmemoryerror-unable-to-create-new-native-thread/