原来Java服务运行在CentOS5.4上正常,最近部署到CentOS6.6服务器上。结果运行一段时间后,程序在执行新建线程操作的时候抛出异常:“java.lang.OutOfMemoryError: unable to create new native thread”。这种情况一般是因为JVM内存不足,通过调整JVM内存参数就能搞定。但是我们的Java服务已经分配了很大的内存,当前实际使用并不多,用jstat查看各区情况也都是很空闲的。所以基本可以排除这个可能。
我怀疑这是因为操作系统的限制导致的,通过对比/proc/进程ID/limits 文件看出了一些线索:
[root@~]# 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
root
soft
nproc
unlimited
可以看到如果程序以root用户执行,则nproc的软限制是
unlimited,其他用户则是1024。由于此设置不符合我们需要,我们将第一排的数值改掉即可。我也是改为“*
soft
nproc
unlimited",这样就相当于没有软限制,只根据硬限制进行约束。