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

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

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中的一个错误。

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

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

请参阅Java HotSpot VM选项

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

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

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

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

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