web-dev-qa-db-ja.com

-Xssと-XX:ThreadStackSizeの違いは何ですか?

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のバグでさえあると思います。

13
user2078148

-Xssは、Java HotSpotVMによって認識される標準オプションです。

-XX:ThreadStackSize他の-XXオプションは安定しておらず、予告なしに変更される場合があります。

Java HotSpot VM Options を参照してください

3
alain.janinm

-Xssは、OpenJDKとOracleJDKの両方の-XX:ThreadStackSizeのエイリアスです。

彼らは異なる方法で引数を解析しますが:
-Xssは、K、M、またはGのサフィックスが付いた番号を受け入れる場合があります。
-XX:ThreadStackSize=は整数(サフィックスなし)(キロバイト単位のスタックサイズ)を想定しています。

7
apangin

Java SE8の2019年に更新

現在の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.
2
Alan Thompson