Java(groovy)アプリケーションのすべてのスレッドのスタックサイズを制御したいだけです。HotspotOracleVMの場合、それを行う2つのパラメーターがあることを知っています( -Xss
および XX:ThreadStackSize
)。
どちらが好ましいですか?それらの間に違いはありますか? Open JDK 7について メーリングリストで質問された人 、-Xss
はHotpot VMと-XX:ThreadStackSize
と同じです。
重要なのは、システムで開始できるスレッドの数を測定しているということです。これを行う私のGroovyスクリプトは次のようになります。
int count = 0
def printCountThreads = {
println("XXX There were started $count threads.")
}
try {
while(true){
new Thread({Thread.sleep(Integer.MAX_VALUE)}).start()
count++
if(count % 1000 == 0){
printCountThreads()
}
}
} catch (Throwable e){
printCountThreads()
throw e
}
興味深いことに、-XX:ThreadStackSize
を使用するとスレッド数が減ります。私は、環境変数Java_OPTSのさまざまなコンテンツを使用してgroovyアプリケーションを起動しています。
groovy countmax-threads.groovy
Java_OPTSを-XX:ThreadStackSize=2m
に設定すると、メモリが消費されるまで約1000の開始スレッドが取得されます。しかし、Java_OPTS='-Xss2m'
を使用すると、予期されるエラーが発生するまで、約32000スレッドを取得します。したがって、-Xss
はまったく機能しないようです。
私は使っている
Javaバージョン「1.8.0_05」
Java(TM)SEランタイム環境(ビルド1.8.0_05-b13)
Java HotSpot(TM)64ビットサーバーVM(ビルド25.5-b02、混合モード)
4つのハードウェアスレッドと約8GBのRAMを備えたUbuntu14.0464ビットマシン。
更新:
これをWindows764ビットマシンと別のJDKで再確認しました。
Javaバージョン "1.8.0_20" Java(TM)SEランタイム環境(ビルド1.8.0_20-b26)Java HotSpot(TM)64ビットサーバーVM (ビルド25.20-b23、混合モード)
そして、-Xss
と-XX:ThreadStackSize
は期待どおりに機能します(いくつかの回答が指摘しているように)。したがって、これはLinux固有の問題であるか、JDKバージョン1.8.05のバグでさえあると思います。
-Xss
は、Java HotSpotVMによって認識される標準オプションです。
-XX:ThreadStackSize
他の-XX
オプションは安定しておらず、予告なしに変更される場合があります。
Java HotSpot VM Options を参照してください
-Xss
は、OpenJDKとOracleJDKの両方の-XX:ThreadStackSize
のエイリアスです。
彼らは異なる方法で引数を解析しますが:-Xss
は、K、M、またはGのサフィックスが付いた番号を受け入れる場合があります。-XX:ThreadStackSize=
は整数(サフィックスなし)(キロバイト単位のスタックサイズ)を想定しています。
現在のOracle Java SE 8のドキュメントでは、-Xss
および-XX:ThreadStackSize=size
は同等です。見る
https://docs.Oracle.com/javase/8/docs/technotes/tools/unix/Java.html
-Xss
:-Xsssize
Sets the thread stack size (in bytes). Append the
letter k or K to indicate KB, m or M to indicate MB, g or G to
indicate GB. The default value depends on the platform:
Linux/ARM (32-bit): 320 KB
Linux/i386 (32-bit): 320 KB
Linux/x64 (64-bit): 1024 KB
OS X (64-bit): 1024 KB
Oracle Solaris/i386 (32-bit): 320 KB
Oracle Solaris/x64 (64-bit): 1024 KB
The following examples set the thread stack size to 1024 KB in different units:
-Xss1m
-Xss1024k
-Xss1048576
This option is equivalent to -XX:ThreadStackSize.
-XX:ThreadStackSize=size
-XX:ThreadStackSize=size
Sets the thread stack size (in bytes). Append the
letter k or K to indicate kilobytes, m or M to indicate
megabytes, g or G to indicate gigabytes. The default
value depends on the platform:
Linux/ARM (32-bit): 320 KB
Linux/i386 (32-bit): 320 KB
Linux/x64 (64-bit): 1024 KB
OS X (64-bit): 1024 KB
Oracle Solaris/i386 (32-bit): 320 KB
Oracle Solaris/x64 (64-bit): 1024 KB
The following examples show how to set the thread stack size to 1024 KB in different units:
-XX:ThreadStackSize=1m
-XX:ThreadStackSize=1024k
-XX:ThreadStackSize=1048576
This option is equivalent to -Xss.