Rya*_*yan 51 c++ java memory jvm runtime
编译器书(The Dragon book)解释了在堆栈上创建的值类型,并在堆上创建了引用类型.
对于Java,JVM还在运行时数据区域中包含堆和堆栈.在堆上创建对象和数组,方法帧被推送到堆栈.所有线程共享一个堆,而每个线程都有自己的堆栈.下图显示了这一点:

有关Java运行时数据区的更多信息.
我不明白的是,由于JVM本质上是一个软件,那些JVM堆,堆栈和线程如何映射到物理机器?
如果有人可以比较Java和C++之间的这些概念,我将不胜感激.因为Java在JVM上运行,但C++没有.
为了使这个问题更加准确,我想知道以下内容:
更新:我为进程的运行时物理内存绘制了一张图片.

Pet*_*rey 36
我不明白的是,由于JVM本质上是一个软件,那些JVM堆,堆栈和线程如何映射到物理机器?
堆是预先分配的虚拟内存连续区域.例如
void* heap = malloc(Xmx); // get the maximum size.
Run Code Online (Sandbox Code Playgroud)
当线程启动时,堆栈由线程库分配.同样,它是虚拟内存的连续区域,即最大堆栈大小.你可以把它想象成一样
void* stack = malloc(Xss); // get the maximum stack size.
Run Code Online (Sandbox Code Playgroud)
本机线程是OS功能,它们不是JVM空间的一部分.
因为Java在JVM上运行,但C++没有.
C++仍然需要运行时环境和库来启动.尝试删除您的C++运行时或libc,这些将无法启动.
与Java相比,C++运行时数据区是什么样的?
您可以使用一个大的虚拟内存区域.没有图片,因为它不会告诉你太多.想象一下标有用户空间的长矩形.
JVM堆,堆栈,寄存器和线程如何映射到操作系统?或者我应该问他们如何映射到物理机器?
再一次没有魔力.JVM堆是内存区域,JVM堆栈与C +使用的本机堆栈相同,JVM的寄存器与C +使用的本机寄存器相同,JVMs线程实际上是C +使用的本机线程.
我认为你假设有比现在更多的魔法或默默无闻.相反,你应该假设已经使用了最简单,高效和轻量级的设计,而且你不会太远.
我应该问他们如何映射到物理机器?
一对一基本上.