一台服務器最多可以有多少Java線程


背景:

  最近被問到【一台服務器最多可以有多少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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM