Java VM可以支持多少個線程?

1.概述

多年來,我們使用的系統的性能呈指數增長。因此,Java VM支持的線程數也增加了。

但是,我們實際上可以創建多少個?答案不是確切數字,因為它取決於許多因素。

我們將討論其中的兩個因素,以及它們如何影響我們可以在Java VM中創建的線程數。

2.棧Stack內存

線程的最重要組成部分之一是它的堆棧。最大堆棧大小和我們創建的線程數與可用系統內存量有直接關係。

因此,增加內存容量也會增加我們可以在系統上運行的最大線程數。有關堆棧大小的更多詳細信息,可以在我們的文章《在JVM中配置堆棧大小》中找到。

最後,值得一提的是,自Java 11起,JVM不會積極地為堆棧提交所有保留的內存。這有助於增加我們可以運行的線程數。換句話說,即使我們增加最大堆棧大小,線程使用的內存量也將基於實際堆棧大小。

3.堆Heap內存

堆不會直接影響我們可以執行的線程數。但是,它也使用相同的系統內存。

因此,增加堆大小會限制堆棧的可用內存,從而減少我們可以創建的最大線程數。

4.操作系統選擇

創建新的Java線程時,將創建一個新的本機OS線程,並將其直接從VM鏈接到該本地OS線程。

因此,操作系統控制著線程的管理。

而且,基於操作系統的類型,會有不同的各種限制。

在以下小節中,我們將介紹最常見系統的這些方面。

4.1 Linux

在內核級別,基於Linux的系統將線程視為進程。 **pid_max**內核參數這樣的進程限制將直接影響我們可以創建的線程數。

另一個內核參數是**threads-max** ,它描述了總的最大線程數。

**sysctl kernel.<parameter-name>**來檢索所有這些參數。

最後,每個用戶的最大進程數是有限制的,可使用ulimit -u命令檢索。

4.2Windows

在Windows計算機上,沒有為線程指定限制。因此,我們可以創建任意數量的線程,直到系統用盡可用系統內存為止。

4.3蘋果系統

運行macOS的系統有兩個主要限制,由兩個內核參數定義:

  • **num_threads**表示可以創建的線程的最大總數
  • **num_taskthreads**表示每個進程的最大線程數

這些參數的值可以通過執行**sysctl kern.** <參數名稱>。

值得一提的是,當達到這些限制之一時, OutOfMemoryError ,這可能會產生誤導。

5.虛擬線程

我們可以利用Project Loom附帶的輕量級虛擬線程(尚未公開)來進一步增加創建線程的數量。

虛擬線程是由JVM創建的,不使用OS線程,這意味著我們實際上可以同時創建數百萬個虛擬線程。

六,結論

在本文中,我們研究了可能影響Java虛擬機中可以創建的最大線程數的最重要方面。

但是,在大多數情況下,增加限制不太可能永久解決可伸縮性問題。我們將需要考慮重新考慮應用程序的實現,甚至考慮應用水平縮放。