【发布时间】:2015-04-30 07:58:43
【问题描述】:
我只想控制 Java(groovy)应用程序中所有线程的堆栈大小。对于 Hotspot Oracle VM,我知道有两个参数可以做到这一点(-Xss 和 XX:ThreadStackSize)。
哪个是首选?它们之间有什么区别吗?关于 Open JDK 7 someone asked on the mailing list,声明 -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 运行时环境 (build 1.8.0_20-b26) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.20-b23,混合模式)
-Xss 和 -XX:ThreadStackSize 按预期工作(正如一些答案指出的那样)。所以我认为这是 Linux 特定的问题,甚至是 JDK 1.8.05 版本中的错误。
【问题讨论】:
-
也许有人可以在他的机器上用另一个虚拟机验证?我为脚本使用了 groovy 2.3.9...
-
Linux 上的相同行为:java 版本“1.8.0_45”Java(TM) SE 运行时环境(构建 1.8.0_45-b14)Java HotSpot(TM) 64 位服务器 VM(构建 25.45-b02 ,混合模式)在我看来,这就像一个特定于 linux 的 JVM 问题......
标签: java multithreading oracle jvm jvm-hotspot