解决 java.lang.OutOfMemoryError: unable to create new native thread
编辑来源: CSDN-Pansanday
日期:2019-01-14 17:29:17
出现场景
最近在部署一个省的项目时,遇到这个问题,该环境提供的服务器配置偏低,而项目本身为了性能,大量的使用的线程,导出出现 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)
至此问题解决。
- 0
- 0
-
赞助
赞赏 -
分享