JVM中可以建立多少個執行緒
阿新 • • 發佈:2019-01-02
在JVM
中,執行緒數量的多少與堆記憶體、棧記憶體的大小有著直接的關係,只不過棧記憶體更加明顯一些。在作業系統中,一個程序的記憶體大小是有限制的,這個限制稱為地址空間,比如32位的Windows
作業系統最大的地址空間約為2G
多一點,作業系統會將程序記憶體的大小控制在最大地址空間以內。下面是一個相對比較精準的計算執行緒數量的公式,其中ReservedOsMemory
是系統保留記憶體,一般在136MB
左右:
執行緒數量 = (最大地址空間(MaxProcessMemory) - JVM堆記憶體 - ReservedOsMemory) / ThjreadStackSize(XSS)
從上面的公式可以看出,堆記憶體不變的情況下,棧記憶體越大,執行緒數量越小
執行緒數量還與作業系統的一些核心配置有很大的關係。例如Linux
下:
/proc/sys/kernel/threads-max
/proc/sys/kernel/pid_max
/proc/sys/vm/max_map_count
下面是測試程式碼,此程式碼可能會導致電腦宕機,僅供參考
不同的JDK
版本,JVM
預設情況下的棧記憶體大小是不一樣的。可以通過下面的引數檢視當前版本JVM
預設的棧記憶體大小(ThreadStackSize
相當於xss
):
java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
配置程式啟動的JVM
java -Xmx256m -Xms64m ThreadCounter
測試步驟:
既然JVM
程序的記憶體大小是固定的,那麼可以固定堆記憶體大小,不斷增加棧記憶體大小
public class ThreadCounter extends Thread { static final AtomicInteger counter = new AtomicInteger(0); public static void main(String[] args) { try { while (true) { new ThreadCounter().start(); } } catch (Throwable e) { System.out.println("failed At=>" + counter.get()); } } @Override public void run() { try { System.out.println("The " + counter.getAndIncrement() + " thread be created."); TimeUnit.MINUTES.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } }