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

use*_*148 13 java oracle multithreading jvm jvm-hotspot

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

哪个是首选?它们之间有什么区别吗?关于Open JDK 7,有人在邮件列表中询问,说明-XssHotpot 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
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,我只是使用 - 减少了一些线程XX:ThreadStackSize.我正在使用环境变量JAVA_OPTS中的不同内容启动groovy应用程序.

groovy countmax-threads.groovy
Run Code Online (Sandbox Code Playgroud)

当我将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中的一个错误.

apa*_*gin 7

-Xss-XX:ThreadStackSizeOpenJDK和Oracle JDK 的别名.

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


ala*_*inm 5

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

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

请参阅Java HotSpot VM 选项

  • 那么为什么会有不同的行为呢? (3认同)