1. 程式人生 > >JVM中可以建立多少個執行緒

JVM中可以建立多少個執行緒

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();
		}
	}
}