少年阿宾

那些青春的岁月

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
 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修改每个线程栈大小。减小此参数,可以提高最大线程数。当然,要保证你的线程使用的内存不会超过这个数。

当然,如果不是因为系统级别的问题,那就的优化程序了,检查有没有泄露的内存,有没有业务逻辑存在大量并发等等。
posted on 2014-12-15 12:08 abin 阅读(422) 评论(0)  编辑  收藏 所属分类: JVM

只有注册用户登录后才能发表评论。


网站导航: