为什么会出现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