天天看點

java.lang.OutOfMemoryError: unable to create new native thread 異常解決解釋

解釋

這個錯誤在高并發請求伺服器經常會出現,因為這個native thread 異常與對應的平台有關。

導緻原因

  1. 你的應用建立太多線程了,一個應用程序建立多個線程,超過系統承載極限。
  2. 你的伺服器并不允許你的應用程式建立這麼多線程,linux系統預設允許單個程序可以建立的線程數是1024個,你的應用建立超過這個數量,就會報java.lang.OutOfMemoryError: unable to create new native thread異常。

解決辦法

  1. 想辦法降低你應用程式建立線程的數量,分析應用是否真的需要建立這麼多線程,如果不是,改代碼将線程數降到最低。
  2. 對應有的應用,确實需要建立很多線程,遠超過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
           
java.lang.OutOfMemoryError: unable to create new native thread 異常解決解釋

第三步 檢視包名

cat UnableCreateNewThreadDemo.java
           
java.lang.OutOfMemoryError: unable to create new native thread 異常解決解釋

第四步 運作

java com.test.UnableCreateNewThreadDemo
           
java.lang.OutOfMemoryError: unable to create new native thread 異常解決解釋

第五步 切換root賬戶 殺死程序

ps -ef|grep java
           
java.lang.OutOfMemoryError: unable to create new native thread 異常解決解釋

切換到建立使用者,這時我們顯示已殺死,用Ctrl+c是退不出去的必須root使用者強制殺死這個程序

java.lang.OutOfMemoryError: unable to create new native thread 異常解決解釋

檢視最大線程數

ulimit -u
           
java.lang.OutOfMemoryError: unable to create new native thread 異常解決解釋

修改最大線程數

如果需要更改我們可以如下操作

目錄情況

java.lang.OutOfMemoryError: unable to create new native thread 異常解決解釋
vim /etc/security/limits.d/20-nproc.conf
           
java.lang.OutOfMemoryError: unable to create new native thread 異常解決解釋

我們修改了5000 重新開機伺服器,我們檢視發現修改的已經從4096變為我們修改的5000

ulimit -u
           
java.lang.OutOfMemoryError: unable to create new native thread 異常解決解釋

這種修改治标不治本,其實導緻這個java.lang.OutOfMemoryError: unable to create new native thread錯誤,還需要從我們代碼入手來解決。