java.lang.OutOfMemoryError: unable to create new native thread
引发此问题的原因有两个:
1.线程数超过了操作系统的限制。
* 使用top命令查看系统资源,如果发现剩余内存很多,而又出现此异常,则基本可以肯定是由于操作系统线程数限制引起的。
[root@jack ~]# top
top - 11:36:52 up 5 days, 1:34, 4 users, load average: 0.00, 0.00, 0.07
Tasks: 131 total, 1 running, 130 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3821320k total, 3122236k used, 699084k free, 112636k buffers
Swap: 6062072k total, 571760k used, 5490312k free, 840728k cached
* 在linux下,可以通过 ulimit -a 查看系统限制
[root@jack ~]# 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) 29644
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
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) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
max user process即系统可创建最大线程数。
* 可以使用 ulimit -u 4096 修改max user processes的值,但是只能在当前终端的这个session里面生效,重新登录后仍然是使用系统默认值。
正确的修改方式是修改/etc/security/limits.d/90-nproc.conf文件中的值。
[root@jack ~]# 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 1024
2.系统内存不足
如果通过top命令确认到是内存不足,则可以通过java启动参数 -Xss修改每个线程栈大小。减小此参数,可以提高最大线程数。当然,要保证你的线程使用的内存不会超过这个数。
当然,如果不是因为系统级别的问题,那就的优化程序了,检查有没有泄露的内存,有没有业务逻辑存在大量并发等等。