xiaoming728

xiaoming728

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

2023-12-11
解决 java.lang.OutOfMemoryError: unable to create new native thread

来源: CSDN-Pansanday

日期:2019-01-14 17:29:17

链接:https://blog.csdn.net/pansanday/article/details/79697761

出现场景

最近在部署一个省的项目时,遇到这个问题,该环境提供的服务器配置偏低,而项目本身为了性能,大量的使用的线程,导出出现 java.lang.OutOfMemoryError: unable to create new native thread异常

异常分析

这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。能创建的线程数的具体计算公式如下:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

MaxProcessMemory 指的是一个进程的最大内存

JVMMemory JVM内存

ReservedOsMemory 保留的操作系统内存

ThreadStackSize 线程栈的大小

在java语言里, 当你创建一个线程的时候,虚拟机会在JVM内存创建一个Thread对象同时创建一个操作系统线程,而这个系统线程的内存用的不是JVMMemory,而是系统中剩下的内存(MaxProcessMemory - JVMMemory - ReservedOsMemory)。由公式得出结论:你给JVM内存越多,那么你能创建的线程越少,越容易发生 java.lang.OutOfMemoryError: unable to create new native thread

问题原因

linux下每个用户都是有进程限制的

通过命令cat /etc/security/limits.d/20-nproc.conf可以看出,普通用户进程限制是1024,root用户没有进程限制

# cat /etc/security/limits.d/20-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
 
*          soft    nproc     1024
root       soft    nproc     unlimited

每个用户最大进程数不止这么多(ulimit -u 或 ulimit -a命令查看)

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31402
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 278528
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 31402
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

可看出,max user processes为31402,也就是用户最大的进程数为31402

由于测试服务器运行了很多项目,每个项目基本上都用到了sofaRPC,所以造成用户创建的进程数被用完,无法创建的错误

解决方案

修改20-nproc.conf文件,将普通用户的进程数改到他能达到的最大值

vi /etc/security/limits.d/90-nproc.conf

# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
 
*          soft    nproc     31402
root       soft    nproc     unlimited

重启应用程序服务器(Tomcat)

至此问题解决。