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

Posted onlys

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不是所有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,因此通过可以注释此行或者将值改大来解决该问题修改完成后保存退出,这样的修改是立马生效的,之后再没出现过内存溢出的异常。


 

技术图片
想要提升自己,工作中遇到的问题,更多JAVA技术相关文章,微信扫一扫关注作者公众号

以上是关于不是所有OutOfMemoryError异常都跟内存有关的主要内容,如果未能解决你的问题,请参考以下文章

性能测试之 JVM 异常说明和分析工具

JVM源码分析之临门一脚的OutOfMemoryError完全解读

线程“main”中的异常java.lang.OutOfMemoryError:GWT应用程序中超出了GC开销限制

java.lang.OutOfMemoryError: PermGen 空间异常

OutOfMemoryError异常 和 StackOverflowError异常

OutOfMemoryError 异常:Java 堆空间,如何调试...?