动态可扩展的JVM堆栈

时间:2012-05-04 22:06:00

标签: java jvm jvm-arguments

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

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

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

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

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

你不。将所有设置保留为默认值,如果线程中的计算需要的堆栈大于允许的堆栈,则Java虚拟机会抛出StackOverflowError。

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

这不会影响JVM堆。 [请参阅-Xmx -Xms以设置堆大小]

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

全部取决于堆的大小以及您希望支持的并发线程数。