JVM规范(JSE 8版)提到:
第12页:2.5.2 JVM堆栈: “因为除了推送和弹出帧之外,永远不会直接操作JVM堆栈,所以帧可能是堆分配的。”
第15页:2.6:框架: “帧是从创建帧的线程的JVM堆栈中分配的。” 在第16页: “请注意,线程创建的帧是该线程的本地帧,不能被任何其他线程引用。”
这对我来说听起来很混乱。由于帧是创建帧的线程的本地,为什么在堆中分配帧,因为堆在所有JVM线程之间共享?除非在这里遗漏一些东西,否则没有意义。第12页上的句子是一个有趣的陈述。
任何提示?感谢。
答案 0 :(得分:4)
JVM堆栈是一种抽象。它可以分配到任何地方或任何地方。例如。如果JIT内联方法,则它没有单独的堆栈帧。
HotSpot JVM使用本机线程堆栈作为JVM堆栈。但是,有一些JVM实现(例如CLDC HI)在Java Heap中分配JVM堆栈。这种方法的好处是对包括线程堆栈在内的所有内容进行单一内存管理。这样的JVM可以在没有标准内存管理器(如libc)的平台上运行,甚至可以在没有OS的情况下运行。
JVM堆也是一种抽象。 JVM线程之间的“共享”不是本机线程堆栈。堆也可能具有线程局部区域。同时,本机线程堆栈驻留在虚拟内存中,虚拟内存也在进程的所有线程之间共享。