1. 概要

何年にもわたって、私たちが使用するシステムのパフォーマンスは飛躍的に向上しました。 そのため、JavaVMがサポートするスレッドの数も増えています。

しかし、実際にいくつ作成できるのでしょうか。 多くの要因に依存するため、答えは正確な数値ではありません。

これらの要因のいくつかと、それらがJavaVMで作成できるスレッドの数にどのように影響するかについて説明します。

2. スタックメモリ

スレッドの最も重要なコンポーネントの1つは、そのスタックです。 作成する最大スタックサイズとスレッド数は、使用可能なシステムメモリの量と直接的な相関関係があります。

したがって、メモリ容量を増やすと、システムで実行できるスレッドの最大数も増えます。スタックサイズの詳細については、記事JVMでのスタックサイズの構成を参照してください。 ]。

最後に、Java 11以降、JVMはスタック用に予約されたすべてのメモリを積極的にコミットしないことを言及する価値があります。 これは、実行できるスレッドの数を増やすのに役立ちます。 つまり、最大スタックサイズを増やしても、スレッドが使用するメモリの量は実際のスタックサイズに基づきます。

3. ヒープメモリ

ヒープは、実行できるスレッドの数に直接影響しません。 ただし、同じシステムメモリも使用しています。

したがって、ヒープサイズを増やすと、スタックで使用可能なメモリが制限され、作成できるスレッドの最大数が減ります。

4. オペレーティングシステムの選択

新しいJavaスレッドを作成すると、新しいネイティブOSスレッドが作成され、VMからのスレッドに直接リンクされます。

したがって、オペレーティングシステムがスレッドの管理を制御します。

さらに、オペレーティングシステムのタイプに基づいて、さまざまな制限が適用される場合があります。

次のサブセクションでは、最も一般的なシステムのこれらの側面について説明します。

4.1. Linux

Linuxベースのシステムは、 kernel レベルで、スレッドをプロセスとして扱います。 したがって、 pid_max カーネルパラメータのようなプロセス制限は、作成できるスレッドの数に直接影響します。

もう1つのカーネルパラメータはthreads-maxで、これはスレッドの全体的な最大数を表します。

を実行することで、これらすべてのパラメータを取得できます sysctlカーネル。

最後に、 ulimit -u コマンドを使用して取得できる、ユーザーあたりの最大プロセス数には制限があります。

4.2. ウィンドウズ

Windowsマシンでは、スレッドに制限はありません。 したがって、システムが使用可能なシステムメモリを使い果たすまで、必要な数のスレッドを作成できます。

4.3. マックOS

macOSを実行するシステムには、2つのカーネルパラメータによって定義される2つの主な制限があります。

  • num_threads は、作成できるスレッドの総数を表します
  • num_taskthreads は、プロセスごとのスレッドの最大数を表します

これらのパラメータの値には、を実行することでアクセスできます。 sysctlkern。

言及する価値のある1つのポイントは、これらの制限の1つに達すると、 OutOfMemoryError がスローされることです。これは、誤解を招く可能性があります。

5. 仮想スレッド

まだ公開されていないProjectLoomに付属している軽量仮想スレッドを活用することで、作成できるスレッドの数をさらに増やすことができます。

仮想スレッドはJVMによって作成され、 OSスレッドを利用しません。つまり、文字通り何百万ものスレッドを同時に作成できます。

6. 結論

この記事では、Java仮想マシンで作成できるスレッドの最大数に影響を与える可能性のある最も重要な側面について説明しました。

ただし、ほとんどの場合、制限を増やしてもスケーラビリティの問題が恒久的に解決される可能性はほとんどありません。 アプリケーションの実装を再考するか、水平スケーリングを適用することを検討する必要があります。