为什么会出现unable to create new native thread?

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

准确的讲该native thread异常与对应的平台(操作系统)有关
导致原因:
后台应用创建了太多线程了,一个应用进程创建多个线程,超过系统承载极限
你的服务器并不允许你的应用程序创建这么多线程。

对于普通用户,Linux系统默认允许单个进程可以创建的线程数是1024个,你的应用创建超过这个数量,就会报java.lang.OutOfMemoryError: unable to create new native thread
解决办法:
1.想办法降低你应用程序创建线程的数量,分析应用是否真的需要创建这么多线程,如果不是,改代码将线程数降到最低
2.对于有的应用,确实需要创建很多钱程,远超过Linux系统的默认一个进程1024个线程的限制,可以通过惨改Linux服务器配置,扩大Linux默认限制。

root用户默认无限制!!!

Windows操作系统没有明确限制,我创建了十几万个线程之后系统已经卡顿非常明显了!!!


public class UnableCreateNativeThreadTest {

    public static void main(String[] args) {
        for (int i = 1; ; i++) {
            System.out.println("************ i = " + i);
            new Thread(() -> {
                try {
                    Thread.sleep(Integer.MAX_VALUE);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }, "线程" + i).start();

        }

    }

}

可以在Linux上运行代码,到九百多个线程的时候就会报java.lang.OutOfMemoryError: unable to create new native thread

 这时,ctrl+c无法退出窗口!!!另开一个命令行窗口找到并强制杀死对应的线程,再回到上一个窗口显示,已杀死!

 查看Linux用户单进程可以创建多少个线程的命令 ulimit -u,普通用户默认1024

修改限制 vim /etc/security/limits.d/90-nproc.conf

 单独设置某账户限制加上一行

username         soft       nproc       num

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐