1. 程式人生 > 其它 >【執行緒】一臺java伺服器可以跑多少個執行緒 & 最大執行緒數?

【執行緒】一臺java伺服器可以跑多少個執行緒 & 最大執行緒數?

技術標籤:Java

每個執行緒都有一個執行緒棧空間通過-Xss設定,查了一下我們伺服器的關於jvm記憶體的配置

-Xms4096m

-Xmx4096m

-XX:MaxPermSize=1024m

只有這三個,並沒有-Xss 和-XX:ThreadStackSize的配置,因此是走的預設值。幾種JVM的預設棧大小:
在這裡插入圖片描述

-Xss 是指設定每個執行緒的堆疊大小
-XX:ThreadStackSize 設定執行緒數大小,會反向設定-Xss大小

可以通過如下命令列印輸出預設值的大小,命令:jinfo -flag ThreadStackSize ;例如

[root@host-192-168-202-229
~]#jinfo -flag ThreadStackSize 1807 -XX:ThreadStackSize=1024

不考慮系統限制,可以通過如下公式計算,得出最大執行緒數量

執行緒數量=(機器本身可用記憶體-JVM分配的堆記憶體)/Xss的值,比如我們的容器本身大小是8G,堆大小是4096M,走-Xss預設值,可以得出 最大執行緒數量:4096個。

根據計算公式,得出如下結論:

結論1:jvm堆越大,系統建立的執行緒數量越小。

結論2:當-Xss的值越小,可生成執行緒數量越多。

我們知道作業系統分配給每個程序的記憶體大小是有限制的,比如32位的Windows是2G。因此作業系統對一個程序下的執行緒數量是有限制的,不能無限的增多。經驗值:3000-5000左右(我沒有驗證)。

剛才說的是不考慮系統限制的情況,那如果考慮系統限制呢,主要跟以下幾個引數有關係:

/proc/sys/kernel/pid_max 增大,執行緒數量增大,pid_max有最高值,超過之後不再改變,而且3264位也不一樣

/proc/sys/kernel/thread-max 系統可以生成最大執行緒數量

max_user_process(ulimit -u)centos系統上才有,沒有具體研究

/proc/sys/vm/max_map_count 增大,數量增多


參考:
《一臺java伺服器可以跑多少個執行緒?》
《JVM調優總結 -Xms -Xmx -Xmn -Xss(轉)》