Javaアプリケーションで使用するスレッドのスタックのチューニング方法および、チューニングによる影響範囲を説明します。
チューニング方法
Java APIで生成するスレッドのスタックサイズは、“-Xss”オプションで指定することができます。
“-Xss”オプションは、バイト単位でスタックサイズを指定します。例えば、スタックサイズを512KBに設定する場合、“-Xss512k”と指定します。
またOpenJDK内で実行されるJavaメソッドを自動的にコンパイルする専用スレッド(コンパイラスレッド)のスタックサイズは、“-XX:CompilerThreadStackSize”オプションで指定することができます。
通常、コンパイラスレッドのスタックサイズを指定する必要はありません。
“-XX:CompilerThreadStackSize”オプションは、キロバイト(Kバイト)単位でコンパイラスレッドのスタックサイズを指定します。例えば、スタックサイズを1024KBに設定する場合、”-XX:CompilerThreadStackSize=1024”と指定します。
Java APIで生成したスレッドおよびコンパイラスレッドのデフォルトのスタックサイズを、“表7.5 Java APIで生成したスレッドおよびコンパイラスレッドのデフォルトのスタックサイズ”に示します。
Java APIで生成したスレッド | コンパイラスレッド |
---|---|
1024KB | 1024KB |
Windows版OpenJDKにおけるスタックサイズは、java.exeなどWindows版が提供するJDKツールを用いた場合の値です。JNIを用いて独自にJava VMを起動しているWindowsアプリケーションの場合は、Java VMを起動したプログラムのメインスレッドに対するスタックサイズと同じ値になります。
チューニングの影響範囲
スタックのサイズを変更した場合の影響範囲を、次に示します。
スタックのサイズを縮小した場合、スタックオーバーフローが発生することがあります。
スタックのサイズを拡張した場合、その分ユーザ空間や仮想メモリが少なくなるため、Javaヒープやネイティブモジュールの動作に必要な領域を確保できず、メモリ不足になることがあります。