java.lang.OutOfMemoryError: unable to create new native thread
引發(fā)此問題的原因有兩個(gè):
1.線程數(shù)超過了操作系統(tǒng)的限制。
* 使用top命令查看系統(tǒng)資源,如果發(fā)現(xiàn)剩余內(nèi)存很多,而又出現(xiàn)此異常,則基本可以肯定是由于操作系統(tǒng)線程數(shù)限制引起的。
[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 查看系統(tǒng)限制
[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即系統(tǒng)可創(chuàng)建最大線程數(shù)。
* 可以使用 ulimit -u 4096 修改max user processes的值,但是只能在當(dāng)前終端的這個(gè)session里面生效,重新登錄后仍然是使用系統(tǒng)默認(rèn)值。
正確的修改方式是修改/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.系統(tǒng)內(nèi)存不足
如果通過top命令確認(rèn)到是內(nèi)存不足,則可以通過java啟動(dòng)參數(shù) -Xss修改每個(gè)線程棧大小。減小此參數(shù),可以提高最大線程數(shù)。當(dāng)然,要保證你的線程使用的內(nèi)存不會(huì)超過這個(gè)數(shù)。
當(dāng)然,如果不是因?yàn)橄到y(tǒng)級別的問題,那就的優(yōu)化程序了,檢查有沒有泄露的內(nèi)存,有沒有業(yè)務(wù)邏輯存在大量并發(fā)等等。