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