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

将Java服务从CentOS5.4迁移到CentOS6.6后,出现“java.lang.OutOfMemoryError: unable to create new native thread”异常。检查发现并非JVM内存不足,而是操作系统限制问题。在CentOS6的/proc/进程ID/limits文件中,max processes数值较低。尝试修改/etc/security/limits.d/90-nproc.conf文件,将默认用户进程数限制改为unlimited,解决了新建线程异常的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      原来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",这样就相当于没有软限制,只根据硬限制进行约束。
      


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值