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

2022-09-03 13:53:35

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

哪个是首选的?它们之间有什么区别吗?关于Open JDK 7,有人在邮件列表中询问,指出对于Hotpot VM来说,这与相同。-Xss-XX:ThreadStackSize

关键是,我正在测量我的系统上可以启动多少个线程。我的时髦脚本可以做到这一点,看起来像这样:

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
}

有趣的是,我只是使用-减少了线程的数量。我正在启动时髦的应用程序,其中包含环境变量JAVA_OPTS中的不同内容。XX:ThreadStackSize

groovy countmax-threads.groovy

当我将JAVA_OPTS设置为 时,我得到大约1000个启动的线程,直到内存被消耗。但是,当我使用时,我会得到大约32000个线程,直到出现预期的错误。因此,这似乎根本不起作用。-XX:ThreadStackSize=2mJAVA_OPTS='-Xss2m'-Xss

我正在使用

java 版本 “1.8.0_05”
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64 位 Server VM (build 25.5-b02, mixed mode)

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

更新:

我在我的Windows 7 64位机器和另一个JDK上重新验证了这一点:

java 版本 “1.8.0_20” Java(TM) SE Runtime Environment (build 1.8.0_20-b26) Java HotSpot(TM) 64 位 Server VM (build 25.20-b23, mixed mode)

并在那里按预期工作(正如一些答案所指出的那样)。所以我想这是一个Linux特定的问题,甚至是JDK版本1.8.05中的一个错误。-Xss-XX:ThreadStackSize


答案 1

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

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


答案 2

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

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

请参阅 Java HotSpot VM 选项