jvm -Xss和-XX:线程堆栈大小之间有什么区别?

mtb9vblg  于 2022-11-07  发布在  其他
关注(0)|答案(5)|浏览(224)

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

pexxcrt2

pexxcrt21#

-Xss是OpenJDK和Oracle JDK的-XX:ThreadStackSize别名。
尽管它们解析参数的方式不同:
-Xss可接受带有K、M或G后缀的数字;
-XX:ThreadStackSize=需要一个整数(不带后缀)-以千字节为单位的堆栈大小。

5uzkadbs

5uzkadbs2#

-Xss是Java HotSpot VM可识别的标准选项。
-XX:ThreadStackSize与其他-XX选项不稳定,如有更改,恕不另行通知.
请参阅Java HotSpot VM Options

2ekbmq32

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

-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.
0sgqnhkj

0sgqnhkj4#

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=size设置Java线程堆栈大小(以千字节为单位)。使用缩放后缀(如k)会缩放千字节值,因此-XX:ThreadStackSize= 1 k会将Java线程堆栈大小设置为1024*1024字节或1 MB。

-Xss size设置线程堆栈大小(以字节为单位)。

dgtucam1

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

相关问题