Java JVM堆中的帧是已分配的还是堆栈已分配的?

Java JVM堆中的帧是已分配的还是堆栈已分配的?,java,jvm,Java,Jvm,JVM规范(JSE 8版)提到: 第12页:2.5.2 JVM堆栈: 由于JVM堆栈除了用于推送和弹出帧外,从不直接操作,因此帧可能是堆分配的 第15页:2.6:框架: “帧是从创建帧的线程的JVM堆栈中分配的。” 第16页: “请注意,由线程创建的框架是该线程的本地框架,不能由任何其他线程引用。” 这听起来让我很困惑。既然一个帧是创建该帧的线程的本地帧,为什么要在堆中分配该帧,因为堆在所有JVM线程之间共享?除非这里漏掉了什么,否则这是没有意义的。第12页的句子很有趣 有什么提示吗?谢谢。JV

JVM规范(JSE 8版)提到:

第12页:2.5.2 JVM堆栈: 由于JVM堆栈除了用于推送和弹出帧外,从不直接操作,因此帧可能是堆分配的

第15页:2.6:框架: “帧是从创建帧的线程的JVM堆栈中分配的。” 第16页: “请注意,由线程创建的框架是该线程的本地框架,不能由任何其他线程引用。”

这听起来让我很困惑。既然一个帧是创建该帧的线程的本地帧,为什么要在堆中分配该帧,因为堆在所有JVM线程之间共享?除非这里漏掉了什么,否则这是没有意义的。第12页的句子很有趣


有什么提示吗?谢谢。

JVM堆栈是一种抽象。它可以分配到任何地方,也可以不分配。例如,如果一个方法由JIT内联,那么它没有单独的堆栈框架

热点JVM使用本机线程堆栈作为JVM堆栈。然而,有一些JVM实现(例如CLDC HI)在Java堆中分配JVM堆栈。这种方法的好处是对所有内容(包括线程堆栈)进行单一内存管理。这种JVM可以在没有标准内存管理器(如libc)的平台上运行,甚至可以在没有操作系统的平台上运行


JVM堆也是一种抽象。JVM线程之间的“共享”并不比本机线程堆栈多。堆也可能有线程局部区域。同时,本机线程堆栈驻留在虚拟内存中,虚拟内存也在进程的所有线程之间共享。

“可能是堆分配的”,我猜,可能是因为它依赖于实现,并且没有JVM规范的固有限制。JVM实现者可以自由地以他们想要的方式实现堆栈。很好的背景介绍,但还没有直接提示这个问题的答案…@user1139247为什么不?“JVM堆中的帧是分配的还是堆栈分配的?”-我已经告诉过这两种JVM实现都存在。最流行的是HotSpot JVM,它使用本机堆栈。既然堆在所有JVM线程之间共享,为什么要在堆中分配帧我还介绍了这种方法的好处。