【问题标题】:What is thread stack size option(-Xss) given to jvm? Why does it have a limit of atleast 68k in a windows pc?给 jvm 的线程堆栈大小选项(-Xss)是什么?为什么它在 Windows pc 中至少有 68k 的限制?
【发布时间】:2014-10-08 04:55:23
【问题描述】:

我已经看到JVM option -Xss - What does it do exactly? 这个链接,但我的问题是这个选项有什么用处。

因为,如果我们为 -Xss 值设置一个非常小的限制,那么线程可能无法正常工作,因为它可能会在大多数情况下抛出 stackOverflow 错误。

为什么这个值至少有 64k 个限制?
我如何得到这个 64k 限制是当我试图在 IntelliJ iDE 上配置运行时 vm 选项时,我试图给出 10k 之类的东西,它弹出了这个错误,指出它需要至少 64k 的线程堆栈大小。

另一个问题是,如何从 java 程序中找到在我的嵌入式设备中运行的 jvm 的默认线程堆栈大小?

谢谢,

【问题讨论】:

  • 当你的程序有很多递归调用时,有一个大的堆栈大小是有帮助的。堆栈还用于保存地址,以便可以在恒定时间内检索它们。
  • 我认为 Adam Adamaszek's answer 解释了此选项的用途 - 如果您不是这种情况,您能否说明您还在寻找什么?
  • 请在单独的帖子中提出您的第二个问题。这是一个完全不同的话题。

标签: java jvm stack jvm-arguments


【解决方案1】:

-Xss允许根据应用需要配置Java线程栈大小:

  • 较大的堆栈大小适用于使用递归算法或其他深度方法调用的应用程序;
  • 较小堆栈大小适用于运行数千个线程的应用程序 - 您可能希望节省线程堆栈占用的内存。

请记住,HotSpot JVM 还为本地方法和 JVM 运行时调用(例如类加载)使用相同的 Java 线程堆栈。这意味着 Java 线程堆栈不仅用于 Java 方法,而且 JVM 也应该为自己的操作保留一些堆栈页面。

所需的最小堆栈大小由以下公式计算:

(StackYellowPages + StackRedPages + StackShadowPages + 2*BytesPerWord + 1) * 4096

在哪里

  • 检测和处理 StackOverflowError 需要StackYellowPagesStackRedPages
  • StackShadowPages 保留用于本机方法;
  • 2*4(32 位 JVM)或 2*8(64 位 JVM)用于 VM 运行时函数;
  • extra 1 用于主线程中的 JIT 编译器递归;
  • 4096 是默认页面大小。

例如对于 32 位 Windows JVM 最小堆栈大小 = (3 + 1 + 4 + 2*4 + 1) * 4K = 68K

顺便说一句,您可以使用这些 JVM 选项减少所需的最小堆栈大小:(不推荐!)

-XX:StackYellowPages=1 -XX:StackRedPages=1 -XX:StackShadowPages=1

【讨论】:

  • 嗨 apangin,我只想知道在哪里可以找到可以提供更多信息的文章和文档。在 Google dint 中搜索 StackYellowPages 给了我很好的结果..
  • @Sen 我怀疑是否有关于此的单独文章,因为它是特定的实现而不是任何规范的一部分。了解 HotSpot 的最佳来源是 the source codethe mailing listthe bugtracker
猜你喜欢
  • 2015-11-11
  • 2011-10-02
  • 2022-07-21
  • 2019-12-23
  • 2013-05-26
  • 2011-06-25
  • 2016-02-15
  • 2012-05-16
  • 1970-01-01
相关资源
最近更新 更多