跳转至

OutOfMemoryError : unable to create new native thread

  • 不能再创建新的线程

高并发请求服务器,经常会出现如下异常:java.lang.OutOfMemoryError:unable to create new native thread

准确的讲该 native Thread异常与对应的平台有关

  • 导致原因
    1. 你的应用创建了太多线程了,一个应用进程创建多个线程,超过了系统的承载极限
    2. 你的服务器并不允许你的应用创建这么多线程,linux系统默认允许单个进行可以创建的线程数是1024个
  • 解决办法
    1. 想办法降低你应用程序创建线程的数量,分析引用是否真的需要创建这么多线程,如果不是,改代码将线程降到最低
    2. 由于有的应用,确实需要创建很多线程,远超过linux系统默认的1024个线程的限制,可以通过修改linux服务器的配置,扩大默认的线程数量;

番外:

​ 一个线程多次start(), 就会抛出不合法异常

异常重现

for ( ;  ;  ) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(Long.MAX_VALUE);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
}
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:714)
    at oom.OOM.main(OOM.java:17)

Linux 调优

1. 查看当前进程最大线程数量

ulimit -u 

2.修改最大线程数量

> cd /etc/security/limits.d/
> ls
20-nproc.conf
> vim 20-nproc.conf
  • 修改如下
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096                   # 其他用户默认进程的线程数量
root       soft    nproc     unlimited             # root 默认的进程的线程数量 

查看**jvm**线程

sudo jstack [线程号]
sudo jps -v