JVM 的 Xss 选项仅覆盖 Java 堆栈还是包括本地堆栈?

7

我知道一些虚拟机,比如Harmony JVM将Java Stack和Native Stack放在一个栈中,并使用M2N Frame为每个线程执行堆栈展开。

其他一些JVM似乎将它们分开。我的问题是,对于设置JVM最大堆栈大小的Xss选项,它是否覆盖Java堆栈的总大小,还包括本地堆栈的大小?


1
“-Xss”是一个非标准的选项,像所有“-X”选项一样,在不同的JVM上可能存在或不存在。如果存在,也不能保证具有相同的行为。在Hotspot JVM的情况下,它被定义为“设置线程堆栈大小”,但这并不意味着JVM如何管理堆栈帧。 - kdgregory
1个回答

6
我对此没有明确的答案,但当您查看一些文档时,可以看到Hotspot成为默认vm时发布的一些文件,其中这个声明:

HotSpot没有单独的本地和Java堆栈。

另一个例证可以在这篇博客文章中找到,该文章涉及堆栈大小调整:

请注意,您的操作系统可能会将由-Xss参数指定的堆栈大小值四舍五入。小心。

因此,似乎hotspot每个线程只有一个堆栈,实际上是本机提供的堆栈(因此会进行四舍五入)。

还有一些证据在这里

在HotSpot实现中,Java方法与C / C ++本机代码共享堆栈帧,即用户本机代码和虚拟机本身

最后,在openjdk源代码中这里

// HotSpot没有单独的本地和Java堆栈


2
再提供一条轶事证据:我有一个使用需要大量本地栈内存的本地库的应用程序。如果我们不指定-Xss2m参数它就会崩溃。 - Ernest Friedman-Hill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接