我只想控制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运行时环境(版本1.8.0_20-b26) Java HotSpot(TM)64位服务器VM(版本25.20-b23,混合模式)
并且-Xss
和-XX:ThreadStackSize
按预期工作(正如一些答案所指出的那样)。所以我认为这是Linux特定的问题,甚至是JDK 1.8.05版本中的错误。
答案 0 :(得分:6)
-Xss
是OpenJDK和Oracle JDK的-XX:ThreadStackSize
的别名。
虽然他们以不同的方式解析论点:
-Xss
可以接受带有K,M或G后缀的数字;
-XX:ThreadStackSize=
需要一个整数(不带后缀) - 堆栈大小,以千字节为单位。
答案 1 :(得分:3)
-Xss
是Java HotSpot VM识别的标准选项。
-XX:ThreadStackSize
由于其他-XX
选项不稳定,如有更改,恕不另行通知。
答案 2 :(得分:2)
-Xss
仅适用于main
Java thead,但-XX:ThreadStackSize
适用于所有Java线程。
如果在命令行上传递了-Xss(或-ss), 它会被启动器直接拾取并在以后用于创建 “主要”Java线程,无需向VM请求首选线程堆栈 尺寸。不一致的地方来自: 如果在-XX:ThreadStackSize之后给出-Xss,那么事情仍然很好; 否则,“主”Java线程将具有-Xss指定的堆栈大小 其他Java线程的堆栈大小仍将遵循 ThreadStackSize。
Inconsistency between -Xss and -XX:ThreadStackSize in the java launcher
答案 3 :(得分:2)
当前的Oracle Java SE 8文档建议-Xss
和-XX:ThreadStackSize=size
是等效的。参见
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
-Xss
:-Xsssize
Sets the thread stack size (in bytes). Append the
letter k or K to indicate KB, m or M to indicate MB, g or G to
indicate GB. The default value depends on the platform:
Linux/ARM (32-bit): 320 KB
Linux/i386 (32-bit): 320 KB
Linux/x64 (64-bit): 1024 KB
OS X (64-bit): 1024 KB
Oracle Solaris/i386 (32-bit): 320 KB
Oracle Solaris/x64 (64-bit): 1024 KB
The following examples set the thread stack size to 1024 KB in different units:
-Xss1m
-Xss1024k
-Xss1048576
This option is equivalent to -XX:ThreadStackSize.
-XX:ThreadStackSize=size
-XX:ThreadStackSize=size
Sets the thread stack size (in bytes). Append the
letter k or K to indicate kilobytes, m or M to indicate
megabytes, g or G to indicate gigabytes. The default
value depends on the platform:
Linux/ARM (32-bit): 320 KB
Linux/i386 (32-bit): 320 KB
Linux/x64 (64-bit): 1024 KB
OS X (64-bit): 1024 KB
Oracle Solaris/i386 (32-bit): 320 KB
Oracle Solaris/x64 (64-bit): 1024 KB
The following examples show how to set the thread stack size to 1024 KB in different units:
-XX:ThreadStackSize=1m
-XX:ThreadStackSize=1024k
-XX:ThreadStackSize=1048576
This option is equivalent to -Xss.
答案 4 :(得分:1)
Oracle Java SE 8 文档表明 -Xss 和 -XX:ThreadStackSize=size 是等效的。 然而这并不正确。尝试例如。
java -XX:ThreadStackSize=1024 -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
java -Xss1024 -version
The stack size specified is too small, Specify at least 160k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
这是固定的,例如在Java 14 documentation:
<块引用>-XX:ThreadStackSize=大小 设置 Java 线程堆栈大小(以千字节为单位)。使用缩放后缀(例如 k)会导致缩放 千字节值,以便 -XX:ThreadStackSize=1k 设置 Java 线程堆栈大小为 1024*1024 字节或 1 兆字节。
和
<块引用>-Xss 大小 设置线程堆栈大小(以字节为单位)。