背景:
最近被問到【一台服務器最多可以有多少Java線程】的問題,大概知道跟計算機硬件、內存等有關系,每個線程都有獨自的java虛擬機棧,應該虛擬機棧的大小,決定了有多少線程。詳情就不太清楚了。
求真過程:
1.跟內存的堆大小、虛擬機棧Xss大小有關系
每個線程都有一個線程棧空間通過-Xss設置,查了一下我們服務器的關於jvm內存的配置
-Xms4096m
-Xmx4096m
-XX:MaxPermSize=1024m
只有這三個,並沒有-Xss 和-XX:ThreadStackSize的配置,因此是走的默認值。幾種JVM的默認棧大小

用如下命令打印,linux服務器 虛擬機棧大小
java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
如下圖,是1M
實際上,計算線程數,有個通用公式
下面是一個相對比較精准的計算線程數量的公式,其中ReservedOsMemory是系統保留內存,一般在136MB左右:
線程數量 = (最大地址空間(MaxProcessMemory) - JVM堆內存 - ReservedOsMemory) / ThreadStackSize(XSS)
比如我們的容器本身大小是8G,堆大小是4096M,走-Xss默認值,可以得出 最大線程數量:4096個。
根據計算公式,內存一定的情況下,得出如下結論:
結論1:jvm堆越大,系統創建的線程數量越小。
結論2:當-Xss的值越小,可生成線程數量越多。
2.跟操作系統內核配置也會影響線程數
線程數量還與操作系統的一些內核配置有很大的關系。例如Linux
下:
- /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 增大,數量增多
線程是非常寶貴的資源,我們要嚴格控制線程的數量
參考:
https://blog.csdn.net/qq_30038111/article/details/83270147
https://www.cnblogs.com/cheyunhua/p/11043997.html