JVM堆栈,堆和线程如何映射到物理内存或操作系统
编译器书(龙书)解释了在堆栈上创build值types,并在堆上创build引用types。
对于Java,JVM还包含运行时数据区域中的堆栈和堆栈。 对象和数组在堆上创build,方法框架被推入堆栈。 一个堆被所有线程共享,而每个线程都有自己的堆栈。 下图显示了这一点:
关于Java运行时数据区域的更多信息
我不明白的是,由于JVM本质上是一个软件,那么这些JVM堆,堆栈和线程如何映射到物理机器呢?
如果有人能比较Java和C ++之间的概念,我将不胜感激。 因为Java在JVM上运行,但是C ++没有。
为了使这个问题更加精确,我想知道以下几点:
- 与Java相比,C ++运行时数据区是什么样的? 一张照片会很有帮助,我找不到像上面的JVM那样的好照片。
- JVM堆,堆栈,寄存器和线程如何映射到操作系统? 或者我应该问他们如何映射到物理机器?
- 每个JVM线程是否仅仅是一个用户线程,并以某种方式映射到内核? (用户线程vs内核线程)
更新 :我画一个进程的运行时物理内存的图片。
我不明白的是,由于JVM本质上是一个软件,那么这些JVM堆,堆栈和线程如何映射到物理机器?
堆是虚拟内存的预分配连续区域。 例如
void* heap = malloc(Xmx); // get the maximum size.
线程启动时,由线程库分配堆栈。 再次,它是一个连续的虚拟内存区域,是最大的堆栈大小。 你可以再次想到它
void* stack = malloc(Xss); // get the maximum stack size.
本机线程是不属于JVM空间的操作系统function。
因为Java在JVM上运行,但是C ++没有。
C ++仍然需要一个运行时环境和库来启动。 尝试删除您的C ++运行时或libc,这些将不会启动。
与Java相比,C ++运行时数据区是什么样的?
有一个大的虚拟内存区域可以使用。 没有照片,因为它不会告诉你很多。 设想一个长矩形标记的用户空间。
JVM堆,堆栈,寄存器和线程如何映射到操作系统? 或者我应该问他们如何映射到物理机器?
再次没有魔法。 JVM堆是内存区域,JVM堆栈与C +使用的本地堆栈相同,JVM的寄存器与C +使用的本地寄存器相同,而JVM线程实际上是本地线程,这是C +使用的。
我认为你认为现在还有更多的魔法或默默无闻。 相反,你应该假设最简单,高效和轻便的devise已经被使用,你不会离得很远。
我应该问他们如何映射到物理机器?
基本上一对一。