我只想控制Java(groovy)应用程序中所有线程的堆栈大小。对于Hotspot Oracle VM,我知道有两个参数可以做到这一点(-Xss
和XX:ThreadStackSize
)。
哪一个是首选的?它们之间有什么区别吗?关于Open JDK 7 someone asked on the mailing list,说明-Xss
对于火锅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位服务器虚拟机(内部版本25.5-b 02,混合模式)
在Ubuntu 14.04 64位机器上,具有四个硬件线程和大约8 GB RAM。
最新消息:
我在我的Windows 7 64位计算机和另一个JDK上验证了这一点:
Java版本“1.8.0_20”Java(TM)SE运行时环境(内部版本1.8.0_20-b26)Java HotSpot(TM)64位服务器虚拟机(内部版本25.20-b23,混合模式)
而且-Xss
和-XX:ThreadStackSize
按预期工作(正如一些答案指出的那样)。所以我认为这是Linux特有的问题,甚至是JDK版本1. 8. 05中的bug。
5条答案
按热度按时间pexxcrt21#
-Xss
是OpenJDK和Oracle JDK的-XX:ThreadStackSize
别名。尽管它们解析参数的方式不同:
-Xss
可接受带有K、M或G后缀的数字;-XX:ThreadStackSize=
需要一个整数(不带后缀)-以千字节为单位的堆栈大小。5uzkadbs2#
-Xss
是Java HotSpot VM可识别的标准选项。-XX:ThreadStackSize
与其他-XX
选项不稳定,如有更改,恕不另行通知.请参阅Java HotSpot VM Options
2ekbmq323#
2019年针对Java SE 8更新
当前的Oracle Java SE 8文档建议
-Xss
和-XX:ThreadStackSize=size
是等效的。请参见https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
对于
-Xss
:对于
-XX:ThreadStackSize=size
0sgqnhkj4#
Oracle Java SE 8文档建议-Xss和-XX:ThreadStackSize=size是等效的。但是这是不正确的。请尝试例如
例如,在Java 14 documentation:
-XX:ThreadStackSize=size设置Java线程堆栈大小(以千字节为单位)。使用缩放后缀(如k)会缩放千字节值,因此-XX:ThreadStackSize= 1 k会将Java线程堆栈大小设置为1024*1024字节或1 MB。
和
-Xss size设置线程堆栈大小(以字节为单位)。
dgtucam15#
-Xss
仅适用于main
Java线程,而-XX:ThreadStackSize
适用于所有Java线程。如果在命令行中传递了-Xss(或-ss),它将直接被启动器获取,并在稍后用于创建“主”Java线程,而无需向VM询问首选的线程堆栈大小。如果在-XX:ThreadStackSize之后给出-Xss,则情况仍然良好;否则,“主”Java线程将具有由-Xss指定的堆栈大小,而其它Java线程的堆栈大小仍将遵循ThreadStackSize的堆栈大小。
Inconsistency between -Xss and -XX:ThreadStackSize in the java launcher