Java VM可以支持多少個線程?
- java
- jvm
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虛擬機中可以創建的最大線程數的最重要方面。
但是,在大多數情況下,增加限制不太可能永久解決可伸縮性問題。我們將需要考慮重新考慮應用程序的實現,甚至考慮應用水平縮放。