【问题标题】:What is the difference between -Xss and -XX:ThreadStackSize?-Xss 和 -XX:ThreadStackSize 有什么区别?
【发布时间】:2015-04-30 07:58:43
【问题描述】:

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


【解决方案1】:

-Xss 是 OpenJDK 和 Oracle JDK 的 -XX:ThreadStackSize 的别名。

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

【讨论】:

  • 好吧,我在指定 -XX:ThreadStackSize=2m 时没有遇到任何问题,尽管你是对的,文档说你告诉我的......但这一切都让我不清楚
  • Oracle Java SE 8 文档建议它们是确切的同义词:docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
  • 谢谢。当我提供“-Xss3m”作为 JAVA_OPTS 但 GC 日志打印“-XX:ThreadStackSize=3072”时。 3072 没有任何前缀,我正在寻找大小以千字节为单位的确认。
【解决方案2】:

-Xss 是 Java HotSpot VM 识别的标准选项。

-XX:ThreadStackSize 作为其他-XX 选项不稳定,如有更改,恕不另行通知。

Java HotSpot VM Options

【讨论】:

  • 那为什么会有不同的行为?
  • @user2078148 你是不是从Oracle 下载了java 热点?声明 -Xss 和 -XX:ThreadStackSize 等效的链接是关于 openjdk。 Openjdk 和 Oracle Hotspot VM 可能不同。见stackoverflow.com/a/11580321/1140748。所以 -XX:ThreadStackSize 可能会因为 -XX 选项不稳定而失败。
  • 感谢您的建议...但是为什么 -XX:ThreadStackSize=2m 可以正常工作而 -Xss 不能呢?
  • Oracle Java SE 8 文档建议它们是确切的同义词:docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
  • 嗨@AlanThompson,是的,这可能是可能的,但它可以改变。如果您可以使用不以 -XX 开头的选项,请执行此操作。 -XX 选项不稳定,如有更改,恕不另行通知。
【解决方案3】:

Java SE 8 的 2019 年更新

当前的 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】:

    -Xss 仅适用于 main Java 线程,但 -XX:ThreadStackSize 适用于所有 Java 线程。

    如果在命令行中传递了 -Xss(或 -ss), 它被启动器直接拾取,稍后用于创建 “主”Java 线程,无需向 VM 询问首选线程堆栈 尺寸。不一致的来源: 如果 -Xss 在 -XX:ThreadStackSize 之后给出,那么情况仍然很好; 否则,“主”Java 线程将具有由 -Xss 指定的堆栈大小 其他 Java 线程的堆栈大小仍将遵循 线程堆栈大小。

    Inconsistency between -Xss and -XX:ThreadStackSize in the java launcher

    【讨论】:

    • 引用的邮件列表帖子似乎适用于 JDK 6 和 7。对于 JDK 8,我将在我的本地计算机上再次验证。你的提示真的很有用,谢谢!
    • 好吧,在详细研究了 Kris Mok 的邮件列表后,我必须纠正你。 -Xss 也适用于 -XX:ThreadStackSize 的线程堆栈大小。当您同时使用两者时会出现问题(按 -Xss -XX:ThreadStackSize 的顺序)。在这种情况下,vm 将只为主线程获取在 -Xss 中指定的值,并为所有其他用户线程获取在 -XXThreadStackSize 中指定的值。这两个选项应该是等价的!使用两者时必须小心(这通常没有任何意义)
    【解决方案5】:

    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 大小 设置线程堆栈大小(以字节为单位)。

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      • 2015-03-26
      • 2013-08-19
      相关资源
      最近更新 更多