解釋
這個錯誤在高并發請求伺服器經常會出現,因為這個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
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL4EDOyETMwIjM0IzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
第三步 檢視包名
cat UnableCreateNewThreadDemo.java
第四步 運作
java com.test.UnableCreateNewThreadDemo
第五步 切換root賬戶 殺死程序
ps -ef|grep java
切換到建立使用者,這時我們顯示已殺死,用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錯誤,還需要從我們代碼入手來解決。