升级CentOS6.6后Java新建线程抛出O…

     原来Java服务运行在CentOS5.4上正常,最近部署到CentOS6.6服务器上。结果运行一段时间后,程序在执行新建线程操作的时候抛出异常:“java.lang.OutOfMemoryError: unable to create new native thread”。这种情况一般是因为JVM内存不足,通过调整JVM内存参数就能搞定。但是我们的Java服务已经分配了很大的内存,当前实际使用并不多,用jstat查看各区情况也都是很空闲的。所以基本可以排除这个可能。
     我怀疑这是因为操作系统的限制导致的,通过对比/proc/进程ID/limits 文件看出了一些线索:
升级CentOS6.6后Java新建线程抛出OutOfMemoryError异常的排查和解决

     对比发现max processes这个数值相比CentOS5.4机器上的数值要明显的小。但是很奇怪的是,通过ulimit -Su 516035 的方式进行设置没有效果。搜索来搜索去,最后搜索到这篇  《Modify 'Soft Limit' of 'Max processes'》 。原来是CentOS6上对进程有额外的限制配置文件。
    [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",这样就相当于没有软限制,只根据硬限制进行约束。
      


你可能感兴趣的:(编程)