JVM的Xss选项是否仅涵盖Java堆栈还是包括本机堆栈?

Sta*_*kER 7 java jvm

我知道像Harmony JVM这样的虚拟机将Java Stack和Native Stack放在一个堆栈中,并为每个线程使用M2N Frame执行堆栈展开.

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

rad*_*dai 6

我没有明确的答案,但当你看一下当热点成为默认vm时发布的一些文件,你可以看到这一点,其中说明:

HotSpot没有单独的本机和Java堆栈

另一个轶事证据可以在这篇博文中找到,它涉及堆栈大小调整:

请注意,您的操作系统完全有可能对-Xss参数指定的堆栈大小的值进行舍入.注意这一点.

所以看起来热点每个线程有一个堆栈,实际上是本机的os提供的堆栈(因此是舍入的).

有一些更多的证据在这里:

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

最后,在openjdk源代码中:

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

  • 还有一个轶事证据:我有一个应用程序使用需要大量本机堆栈的本机库.除非我们指定-Xss2m,否则它会崩溃. (2认同)