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


我只想控制Java(groovy)应用程序中所有线程的堆栈大小。对于Hotspot Oracle VM,我知道有两个参数可以做到这一点(-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,混合模式)

在具有四个硬件线程和大约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中的一个错误。


8723
2018-02-27 14:53


起源

也许有人可以在他的机器上用另一个vm验证?我使用groovy 2.3.9作为脚本...... - user2078148
linux上的相同行为:java版本“1.8.0_45”Java(TM)SE运行时环境(版本1.8.0_45-b14)Java HotSpot(TM)64位服务器VM(版本25.45-b02,混合模式)对我来说似乎一个特定于Linux的JVM问题...... - user2078148


答案:


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

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

看到 Java HotSpot VM选项


3
2018-02-27 15:03



为什么有行为不同? - user2078148
@ user2078148请教你从Oracle下载java热点?声明-Xss和-XX:ThreadStackSize相同的链接是关于openjdk的。 Openjdk和Oracle Hotspot VM可能有所不同。看到 stackoverflow.com/a/11580321/1140748。所以-XX:ThreadStackSize可能会因为-XX选项不稳定而失败。 - alain.janinm
谢谢你的建议...但为什么比-XX:ThreadStackSize = 2m只是工作而-Xss不行? - user2078148


-Xss 是别名 -XX:ThreadStackSize 适用于OpenJDK和Oracle JDK。

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


5
2018-02-27 17:22



好吧,我在指定-XX时没有遇到任何问题:ThreadStackSize = 2m,虽然你是对的,但是文档说出你告诉我的内容......但是这一切都让人不清楚 - user2078148


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

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

-Xss和-XX之间的不一致:java启动器中的ThreadStackSize


2
2018-02-28 07:16



引用的邮件列表帖子似乎适用于JDK 6和7.对于JDK 8,我将再次在本地计算机上验证。你提示真的很有用,谢谢! - user2078148
在详细研究了Kris Mok的邮件列表后,我必须纠正你。 -Xss也适用于线程堆栈大小-XX:ThreadStackSize。当您同时使用两者时(按照-Xss -XX:ThreadStackSize的顺序)会出现问题。在这种情况下,vm将仅为主线程获取-Xss中指定的值,并为所有其他用户线程获取-XXThreadStackSize中指定的值。这两个选项应该是等价的!使用两者时必须小心(通常没有任何意义) - user2078148
@ user2078148是的,你是对的〜 - lichengwu