不是所有OutOfMemoryError异常都跟内存有关

一个老鸟遇到一个稀奇的问题后,如果只是想想,那么可能会失去一次丰富自己的机会。


如果从开始养成一个习惯,把所有难解决的问题都记录下来,面试的时候,也可能是给自己一次机会


***************正文**************


前不久,服务器上老是报内存溢出的异常:Java.lang.OutOfMemoryError: unable to create new native thread。


看到内存溢出第一个想到的就是内存不够,或者代码有问题,为了先解决问题,就设置了下tomcat的内存


JAVA_OPTS="-server -XX:PermSize=1024M -XX:MaxPermSize=2048m -DentityExpansionLimit=64000"


但是经过几个小时的代码review,不存在大对象和重复创建对象的问题。


之后又用jvisualvm 看了下内存的占用情况,GC和内存都正常


结果还是报这个错,后来怀疑是权限问题,使用root用户启动tomcat就好了。


经过运维同事的提醒,用ulimit -u查看了下最大线程数,原来Linux用户默认能够创建的最大线程数是1024,所以才会报这个错误。


下面,介绍一下修改linux系统用户最大线程数限制:


centos6.5/linux系统对线程数量有个最大限制,当达到系统限制的最大线程数时使用账号密码ssh到系统时是无法登陆的,会报Write failed: Broken pipe,在root用户下切换到该用户会报  su: 无法设置用户ID: 资源暂时不可用


1.# su - xxx(普通用户)

su: 无法设置用户ID: 资源暂时不可用

2.# ulimit -u

1024

由此可以看出最大线程数为1024

3.修改最大线程数的配置

# vi /etc/security/limits.d/90-nproc.conf

内容如下:

      *          soft    nproc    1024

      root      soft    nproc    unlimited

上面可以看除了root用户外的所有用户均限制为1024,因此通过可以注释此行或者将值改大来解决该问题修改完成后保存退出,这样的修改是立马生效的,之后再没出现过内存溢出的异常。


转载:https://mp.weixin.qq.com/s?__biz=MzI2MTI4NzIyNA==&mid=2247483671&idx=1&sn=d0832b8fe2171dfe947ffbbd0b9895c7&chksm=ea5dfd40dd2a7456fafdb9343b257457f9fdd4d635df212e46aacc1540ba3582d5bbf21e128d#rd


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值