JVMでのスタックサイズの構成
1. 概要
このクイックチュートリアルでは、HotSpotJVMでスレッドスタックサイズを構成する方法を説明します。
2. デフォルトのスタックサイズ
各JVMスレッドには、呼び出しスタック情報、ローカル変数、および部分的な結果を格納するためのプライベートネイティブスタックがあります。 したがって、スタックはメソッド呼び出しで重要な役割を果たします。 これはJVM仕様の一部であり、その結果、そこにあるすべてのJVM実装はスタックを使用しています。
ただし、スタックサイズなどの他の実装の詳細は、実装固有です。 これからは、HotSpot JVMに焦点を当て、JVMとHotSpotJVMという用語を同じ意味で使用します。
ともかく、
スタックのサイズを指定しない場合、JVMはデフォルトサイズでスタックを作成します。通常、このデフォルトサイズはオペレーティングシステムとコンピューターアーキテクチャによって異なります。 たとえば、これらはJava14の時点でのデフォルトサイズの一部です。
- Linux / x86(64ビット):1 MB
- macOS(64ビット):1 MB
- Oracle Solaris(64ビット):1 MB
- Windowsでは、JVMはシステム全体のスタックサイズを使用します
基本的に、最新のオペレーティングシステムとアーキテクチャでは、スタックごとに約1MBが期待できます。
3. スタックサイズのカスタマイズ
スタックサイズを変更するには、-Xss Tuning フラグを使用できます。たとえば、-Xss1048576はスタックサイズを1MBに設定します。
java -Xss1048576 // omitted
サイズをバイト単位で計算したくない場合は、いくつかの便利なショートカットを使用して、さまざまな単位を指定できます。KBを示す文字kまたはK、 m またはMはMBを示し、gまたはGはGBを示します。 たとえば、スタックサイズを1MBに設定するいくつかの異なる方法を見てみましょう。
-Xss1m
-Xss1024k
-Xss と同様に、 -XX:ThreadStackSizeチューニングフラグを使用してスタックサイズを構成することもできます。 -XX:ThreadStackSize の構文。ただし、少し違います。 サイズとフラグ名を等号で区切る必要があります。
java -XX:ThreadStackSize=1024 // omitted
HotSpot JVM では、最小値未満のサイズを使用できません。
$ java -Xss1K -version
The Java thread stack size specified is too small. Specify at least 144k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
また、では最大値(通常は1 GB)を超えるサイズを使用できません。
$ java -Xss2g -version
Invalid thread stack size: -Xss2g
The specified size exceeds the maximum representable size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
4. 結論
このクイックチュートリアルでは、HotSpotJVMでスレッドスタックサイズを構成する方法を説明しました。