JVM 规范表明 JVM 堆栈可以是固定大小的,也可以是动态可扩展的。
-Xss JVM 选项允许设置固定大小,如果我没有设置此选项是设置默认值(大约 512-2048k),但如何告诉 JVM 在需要时动态分配其堆栈?
如果我不能设置动态大小选项,设置一个大的 -Xss 值(比如说 20M)实际上会为我的 JVM 中的每个线程分配 20MB 的内存,还是动态分配的内存限制为 20MB?
JVM 规范表明 JVM 堆栈可以是固定大小的,也可以是动态可扩展的。
-Xss JVM 选项允许设置固定大小,如果我没有设置此选项是设置默认值(大约 512-2048k),但如何告诉 JVM 在需要时动态分配其堆栈?
如果我不能设置动态大小选项,设置一个大的 -Xss 值(比如说 20M)实际上会为我的 JVM 中的每个线程分配 20MB 的内存,还是动态分配的内存限制为 20MB?
最大堆栈大小是分配给堆栈的虚拟地址空间量。内存仅根据需要提交给堆栈。
请注意,在 32 位系统上,虚拟地址空间是一种相对稀缺的资源。每个进程获得的内存少于(有时远少于)4GB。考虑到这一点,20MB 的堆栈会将线程数限制在 75 到 175 之间。
关于动态扩展,即使规范可能支持它,实现也可能不支持。
那么,如何告诉 JVM 在需要时动态分配它的堆栈呢?
你不。您将所有设置保留为默认设置,如果线程中的计算需要比允许的更大的堆栈,Java 虚拟机将引发 StackOverflowError。
这是您使用 -Xss 显式增加新线程的内存分配的提示。
这不会影响 JVM 堆。[参见 -Xmx -Xms 设置堆大小]
另外我必须说,每个线程 20Mb 似乎有点过多。
这一切都取决于你的堆大小和你想要支持的并发线程数。