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修改每個線程棧大小。減小此參數,可以提高最大線程數。當然,要保證你的線程使用的內存不會超過這個數。
當然,如果不是因為系統級別的問題,那就的優化程序了,檢查有沒有泄露的內存,有沒有業務邏輯存在大量并發等等。
引發此問題的原因有兩個:
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修改每個線程棧大小。減小此參數,可以提高最大線程數。當然,要保證你的線程使用的內存不會超過這個數。
當然,如果不是因為系統級別的問題,那就的優化程序了,檢查有沒有泄露的內存,有沒有業務邏輯存在大量并發等等。