高併發請求服務器時,經常出現如下異常:java.lang.OutOfMemoryError:unable to create new native thread.
準確的講,該native thread錯誤與對應的平臺有關。
導致原因:
- 你的應用創建了太多的線程,一個應用進程創建多個線程,超過系統承載極限
- 你的服務器並不允許你的應用程序創建這麼多線程,linux系統默認允許單個進程可以創建的線程數是1024個。你的應用創建超過這個數據,就會報java.lang.OutOfMemoryError:unable to create new native thread.
解決辦法:
- 想辦法降低你應用程序創建線程的數量,分析應用是否真的需要創建這麼多線程,如果不是,改代碼將線程數降到最低。
- 對於有的應用,確實需要創建很多線程,遠超過linux系統默認的1024個線程的限制,可以通過修改linux服務器配置,擴大linux默認限制
代碼示例:
public class UnableToCreateNewNativeThreadDemo {
public static void main(String[] args) {
for (int i = 0; ; i++) {
System.out.println("*********************i=" + i);
new Thread(() -> {
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "" + i).start();
}
}
}
運行結果:
參考《尚硅谷面試》