这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。
java程序一直报错,并且linux切换用户报错
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:717)
[root@app5 ~]# su kexie
su: failed to execute /bin/bash: Resource temporarily unavailable
首先查看linux系统设置的最大线程数 与 当前线程数,发现当前线程数远小于设置的最高配,所以不是这个原因
[root@app1 BMS]# sysctl kernel.pid_max
kernel.pid_max = 32768
[root@app1 BMS]# ps -eLf | wc -l
4544
查看当前linux用户所拥有创建最大的线程数 与 当前线程数,发现此用户已超过最大的线程数创建
[kexie@app5 root]$ ulimit -u
1024
[kexie@app5 ~]# ps -eLf | wc -l
5127
所以就需要增加此用户能创建的线程数来解决问题
vi /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 10240
root soft nproc unlimited
查看当前用户可创建最大线程数设置成 max user processes 10240了,解决了问题。
[kexie@app5 root]$ 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) 127959
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 10240
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited