我只想控制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中的一个错误。