-Xss和-XX有什么区别:ThreadStackSize?

时间:2015-02-27 14:53:48

标签: java multithreading oracle jvm jvm-hotspot

我只想控制Java(groovy)应用程序中所有线程的堆栈大小。对于Hotspot Oracle VM,我知道有两个参数可以做到这一点(-XssXX:ThreadStackSize)。

哪个是首选?它们之间有什么区别吗?关于Open JDK 7 someone asked on the mailing list,声明-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,混合模式)

在具有四个硬件线程和大约8 GB RAM的Ubuntu 14.04 64位计算机上。

更新:

我在Windows 7 64位计算机和另一台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版本中的错误。

5 个答案:

答案 0 :(得分:6)

-Xss是OpenJDK和Oracle JDK的-XX:ThreadStackSize的别名。

虽然他们以不同的方式解析论点:
-Xss可以接受带有K,M或G后缀的数字;
-XX:ThreadStackSize=需要一个整数(不带后缀) - 堆栈大小,以千字节为单位。

答案 1 :(得分:3)

-Xss是Java HotSpot VM识别的标准选项。

-XX:ThreadStackSize由于其他-XX选项不稳定,如有更改,恕不另行通知。

请参阅Java HotSpot VM Options

答案 2 :(得分:2)

-Xss仅适用于main Java thead,但-XX:ThreadStackSize适用于所有Java线程。

  

如果在命令行上传递了-Xss(或-ss),   它会被启动器直接拾取并在以后用于创建   “主要”Java线程,无需向VM请求首选线程堆栈   尺寸。不一致的地方来自:    如果在-XX:ThreadStackSize之后给出-Xss,那么事情仍然很好;    否则,“主”Java线程将具有-Xss指定的堆栈大小   其他Java线程的堆栈大小仍将遵循   ThreadStackSize。

Inconsistency between -Xss and -XX:ThreadStackSize in the java launcher

答案 3 :(得分:2)

针对Java SE 8的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.

答案 4 :(得分:1)

Oracle Java SE 8 文档表明 -Xss 和 -XX:ThreadStackSize=size 是等效的。 然而这并不正确。尝试例如。

java -XX:ThreadStackSize=1024 -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

java -Xss1024 -version
The stack size specified is too small, Specify at least 160k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

这是固定的,例如在Java 14 documentation

<块引用>

-XX:ThreadStackSize=大小 设置 Java 线程堆栈大小(以千字节为单位)。使用缩放后缀(例如 k)会导致缩放 千字节值,以便 -XX:ThreadStackSize=1k 设置 Java 线程堆栈大小为 1024*1024 字节或 1 兆字节。

<块引用>

-Xss 大小 设置线程堆栈大小(以字节为单位)。