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

r n*_* ne 7 java jvm

JVM规范(JSE 8版)提到:

第12页:2.5.2 JVM堆栈:"因为除了推送和弹出帧之外,永远不会直接操作JVM堆栈,因此帧可能是堆分配的."

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

这对我来说听起来很混乱.由于帧是创建帧的线程的本地,为什么在堆中分配帧,因为堆在所有JVM线程之间共享?除非在这里遗漏一些东西,否则没有意义.第12页上的句子是一个有趣的陈述.

任何提示?谢谢.

apa*_*gin 6

JVM堆栈是一个抽象。它可以分配在任何地方或根本没有分配。例如,如果某个方法由JIT内联,则它没有单独的堆栈框架。

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

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