JVM 规范(JSE 8 版)提到:
第 12 页:2.5.2 JVM 堆栈:
“因为除了推送和弹出帧之外,JVM 堆栈永远不会被直接操作,因此帧可能是堆分配的。”
第 15 页:2.6:框架:
“帧是从创建帧的线程的 JVM 堆栈中分配的。”
第 16 页:
“请注意,线程创建的帧是该线程本地的,不能被任何其他线程引用。”
这对我来说听起来很令人困惑。由于帧对于创建该帧的线程而言是本地的,既然堆在所有 JVM 线程之间共享,为什么还要在堆中分配帧呢?除非这里遗漏了什么,否则它就没有意义。第12页的这句话是一个有趣的说法。
有什么提示吗?谢谢。
JVM 堆栈是一个抽象。它可以分配在任何地方或根本不分配在任何地方。例如。如果方法由 JIT 内联,则它没有单独的堆栈帧。
HotSpot JVM 使用本机线程堆栈作为 JVM 堆栈。然而,有一些 JVM 实现(例如 CLDC HI)在 Java 堆中分配 JVM 堆栈。这种方法的好处是对包括线程堆栈在内的所有内容进行单一内存管理。这样的 JVM 可以在没有标准内存管理器(如 libc)甚至没有操作系统的平台上运行。
JVM 堆也是一个抽象。它在 JVM 线程之间并不比本机线程堆栈更“共享”。堆也可能具有线程局部区域。同时,本机线程堆栈驻留在虚拟内存中,该虚拟内存也在进程的所有线程之间共享。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)