【问题标题】:Dynamically expandable JVM stack动态可扩展的 JVM 堆栈
【发布时间】:2012-05-04 22:05:59
【问题描述】:

JVM specification 表示 JVM 堆栈可以是固定大小的,也可以是动态扩展的。

-Xss JVM 选项允许设置固定大小,如果我没有设置此选项是设置默认值(大约 512-2048k),但如何告诉 JVM 在需要时动态分配其堆栈?

如果我无法设置动态大小选项,设置一个大的 -Xss 值(比如说 20M)实际上会为我的 JVM 中的每个线程分配 20MB 的内存,还是动态分配的内存限制为 20MB?

【问题讨论】:

  • 我对这个问题的答案不是很满意。在 64 位架构上,将千兆字节分配给堆栈是否有真正的惩罚?

标签: java jvm jvm-arguments


【解决方案1】:

最大堆栈大小是分配给堆栈的虚拟地址空间量。内存仅根据需要提交给堆栈。

请注意,在 32 位系统上,虚拟地址空间是一种相对稀缺的资源。每个进程获得的内存少于(有时很多)少于 4GB。考虑到这一点,20MB 的堆栈会将线程数限制在 75 到 175 之间。

【讨论】:

  • 意味着对于给定线程不使用超过 1024k 的堆栈,设置 -Xss1024k 或 -Xss1024m 将具有完全相同的性能?短限制只能作为有缺陷的递归代码的安全措施?
  • 您如何解释在HotSpot FAQ(“我的应用程序有很多线程并且内存不足,为什么?”部分)建议将 -Xss 值减小为面对 OutOfMemory 时能够运行更多线程吗?
  • @A21z 如果您使用-Xss1m-Xss1g 将在64 位JVM 上产生大致相同的效果。在 32 位 JVM 上,您的虚拟地址空间有限,取决于操作系统(无论您有多少内存),介于 1.5 和 3.5 GB 之间
【解决方案2】:

关于动态扩展,即使规范可能支持它,实现也可能不支持。

那么,如何告诉JVM在需要的时候动态分配它的栈呢?

你不知道。您将所有设置保留为默认设置,如果线程中的计算需要比允许的更大的堆栈,Java 虚拟机将引发 StackOverflowError。

这是您使用 -Xss 显式增加新线程的内存分配的提示。

这不会影响 JVM 堆。 [查看 -Xmx -Xms 设置堆大小]

另外我必须说,每个线程 20Mb 似乎有点过多。

一切都取决于您的堆大小和您希望支持的并发线程数。

【讨论】:

    猜你喜欢
    • 2019-07-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多