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