• 不是所有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技术相关文章,微信扫一扫关注作者公众号

  • 相关阅读:
    我的VB之路
    VB 2005 初学者的书-来自MSDN
    腾讯比Groupon更想要
    Google在移动互联网
    HTML5之二认识HTML5
    HTML5之三认识HTML5
    HTML5之一认识HTML5
    SQL 临时表
    通过COM发送邮件而不跳出安全警告
    SSRS报表创建步骤(转载)
  • 原文地址:https://www.cnblogs.com/onlys/p/11753697.html
Copyright © 2020-2023  润新知