解释
这个错误在高并发请求服务器经常会出现,因为这个native thread 异常与对应的平台有关。
导致原因
- 你的应用创建太多线程了,一个应用进程创建多个线程,超过系统承载极限。
- 你的服务器并不允许你的应用程序创建这么多线程,linux系统默认允许单个进程可以创建的线程数是1024个,你的应用创建超过这个数量,就会报java.lang.OutOfMemoryError: unable to create new native thread异常。
解决办法
- 想办法降低你应用程序创建线程的数量,分析应用是否真的需要创建这么多线程,如果不是,改代码将线程数降到最低。
- 对应有的应用,确实需要创建很多线程,远超过linux系统默认1024个线程的限制,可以通过修改linux服务器配置扩大linux默认限制。
代码演示 演示故障
注意:代码一定不能上传到root用户,可以新建个用户来演示,因为关闭进程我们需求切换到root用户,如果在root用户则需要强制重启虚拟机。
新建用户
adduser javademo
添加密码 12345678
passwd javademo
第一步 编写代码
public class UnableCreateNewThreadDemo {
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();
}
}
}
第二步 把java文件【UnableCreateNewThreadDemo.java】上传到linux系统上 然后编译
javac -d . UnableCreateNewThreadDemo.java
第三步 查看包名
cat UnableCreateNewThreadDemo.java
第四步 运行
java com.test.UnableCreateNewThreadDemo
第五步 切换root账户 杀死进程
ps -ef|grep java
kill -9 1425
切换到新建用户,这时我们显示已杀死,用Ctrl+c是退不出去的必须root用户强制杀死这个进程
查看最大线程数
ulimit -u
修改最大线程数
如果需要更改我们可以如下操作
目录情况
vim /etc/security/limits.d/20-nproc.conf
我们修改了5000 重启服务器,我们查看发现修改的已经从4096变为我们修改的5000
ulimit -u
这种修改治标不治本,其实导致这个java.lang.OutOfMemoryError: unable to create new native thread错误,还需要从我们代码入手来解决。