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

  • 相关阅读:
    图的概念、存储、遍历、最短路径问题、最小生成树、拓扑排序、关键路径
    Nginx负载均衡
    Nginx反向代理
    Nginx配置虚拟主机
    Linux下Nginx安装
    freemarker使用
    ActiveMQ与spring整合
    ActiveMQ安装
    全局异常处理
    solr整合spring
  • 原文地址:https://www.cnblogs.com/onlys/p/11753697.html
Copyright © 2011-2022 走看看