美文网首页
java.lang.OutOfMemoryError: unab

java.lang.OutOfMemoryError: unab

作者: 牛逼的二进制 | 来源:发表于2018-07-18 23:16 被阅读0次

    java.lang.OutOfMemoryError: unable to create new native thread
    这个异常一般由于两个原因导致的:

    1)内存空间不足以满足创建线程所需的stack size
      virtual memory < stack size*the number of threads
    2)线程数已达到操作系统的上限
      线程 vs 进程

    查看jvm stack size 相关参数:

    java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
    intx CompilerThreadStackSize                   = 0               {pd product}      
    intx ThreadStackSize                           = 1024            {pd product}      
    intx VMThreadStackSize                         = 1024            {pd product}  
    

    操作系统进程相关参数:

    进程可用最大虚拟内存
    ulimit -v
    unlimited
    
    最大栈大小
    ulimit -s
    8192
    
    每个用户可创建最大进程数
    ulimit -u
    510226
    

    ulimit 命令详细说明

    系统支持的最大进程数
    cat /proc/sys/kernel/pid_max
    32768
    
    共享内存最大线程数
    cat /proc/sys/kernel/threads-max
    1020452
    

    pid_max threads-max 说明

    获取进程id
    ps -ef | grep <key word>
    
    查询当前某程序的线程或进程数
    pstree -p <pid> | wc -l
    查询当前系统已用的线程或进程数
    pstree -p | wc -l
    

    pstree详细说明

    打印thread dump
    由于已经不能创建新的线程,所以使用jstack打印thread dump时会报错,可以使用kill -3 <pid>

    # There is insufficient memory for the Java Runtime Environment to continue.
    # Cannot create GC thread. Out of system resources.
    # An error report file with more information is saved as:
    # ******.log
    

    打印thread dump的几种方法

    分析thread dump
    可以直接看thread dump,也可以借助图形界面工具,更清晰方便些,比如:
    http://fastthread.io/

    解决问题
    下面链接给出了几种不同原因导致异常对应的解决方法,但方法二中只讲了ulimit -u,实际上面提到的几个进程相关的限制参数,都会影响进程的数量。
    https://blog.fastthread.io/2016/07/06/troubleshoot-outofmemoryerror-unable-to-create-new-native-thread/

    相关文章

      网友评论

          本文标题:java.lang.OutOfMemoryError: unab

          本文链接:https://www.haomeiwen.com/subject/wugapftx.html