【執行緒】一臺java伺服器可以跑多少個執行緒 & 最大執行緒數?
阿新 • • 發佈:2020-12-27
技術標籤: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有最高值,超過之後不再改變,而且32,64位也不一樣
/proc/sys/kernel/thread-max 系統可以生成最大執行緒數量
max_user_process(ulimit -u)centos系統上才有,沒有具體研究
/proc/sys/vm/max_map_count 增大,數量增多