Java规范告诉我们有关线程堆栈的一些信息。 除其他事项外:
每个Java虚拟机线程都有一个私有Java虚拟机堆栈,与该线程同时创建。
因为除了推送和弹出框架外,从不直接操纵Java虚拟机堆栈,所以可以为堆分配帧。 Java虚拟机堆栈的内存不必是连续的。
规范允许Java虚拟机堆栈具有固定大小,或根据计算要求动态扩展和收缩。
现在,如果我们专注于诸如HotSpot之类的JVM实现,我们可以获得更多信息。 这是我从不同来源收集到的一些事实:
HotSpot中线程的最小堆栈大小似乎是固定的。 这就是上述native选项的作用。(资源)
在Java SE 6中,Sparc的默认值在32位VM中为512k,在64位VM中为1024k。 ...您可以通过使用-Xss选项来减小堆栈大小。 ... 64k是每个线程允许的最小堆栈空间量。
JRockit将内存与堆栈所在的堆分开分配。 (资源)
请注意,JVM使用的内存不仅仅是堆。 例如,Java方法,线程堆栈和本机句柄与堆以及JVM内部数据结构分开分配在内存中。
HotSpot中的Java线程和本机OS线程之间存在直接映射。 (资源)。
但是HotSpot中的Java线程堆栈是由软件管理的,而不是OS本机线程堆栈。 (资源)
它使用单独的软件堆栈来传递Java参数,而本地C堆栈由VM本身使用。 许多JVM内部变量(例如Java线程的程序计数器或堆栈指针)存储在C变量中,不能保证始终将其保留在硬件寄存器中。 这些软件解释器结构的管理消耗了总执行时间的相当大的份额。
JVM还为本地方法和JVM运行时调用(例如类加载)使用相同的Java线程堆栈。 (资源)。
有趣的是,作为性能优化,甚至分配