编译器书(龙书)解释说,值类型是在栈上创建的,而引用类型是在堆上创建的。
对于 Java,JVM 在运行时数据区也包含堆和栈。对象和数组在堆上创建,方法帧被插入堆栈。所有线程共享一个堆,而每个线程都有自己的堆栈。下图显示了这一点:
更多关于 Java run-time data areas .
我不明白的是,既然 JVM 本质上是一个软件,那么那些 JVM 堆、栈和线程是如何映射到物理机的呢?
如果有人可以比较 Java 和 C++ 之间的这些概念,我将不胜感激。因为 Java 在 JVM 上运行,而 C++ 却没有。
为了让这个问题更准确,我想知道以下几点:
- 与 Java 相比,C++ 运行时数据区是什么样的?图片会很有帮助,我找不到像上面的 JVM 那样的好图片。
- JVM 堆、栈、寄存器和线程如何映射到操作系统?或者我应该问它们如何映射到物理机?
- 每个 JVM 线程真的只是一个用户线程并以某种方式映射到内核吗? (用户线程与内核线程)
更新:
我为一个进程的运行时物理内存画了一张图。
最佳答案
What I don't understand is that since JVM is essentially a software, how are those JVM heap, stack and threads mapped to physical machine?
堆是一个预先分配的连续虚拟内存区域。例如
void* heap = malloc(Xmx); // get the maximum size.
堆栈是在线程启动时由线程库分配的。同样,它是虚拟内存的连续区域,是最大堆栈大小。同样,您可以将其视为
void* stack = malloc(Xss); // get the maximum stack size.
native 线程是不属于 JVM 空间的操作系统特性。
Because Java runs on JVM, but C++ does not.
C++ 仍然需要运行时环境和库才能启动。尝试删除您的 C++ Runtime 或 libc,这些都不会启动。
Comparing with Java, What does C++ run-time data area look like?
您可以使用一大块虚拟内存。没有图片,因为它不会告诉你太多。想象一个长方形标记为用户空间。
How the JVM heap, stack, registers and threads are mapped to operating system? or I should ask how they are mapped to physical machine?
再一次没有魔法。 JVM堆是内存区域,JVM堆栈与C+使用的 native 堆栈相同,JVM的寄存器与C+使用的 native 寄存器相同,JVM线程实际上是C+使用的 native 线程.
我认为您假设发生的事情比实际情况更多。相反,您应该假设已经使用了最简单、高效和轻量级的设计,并且离您不远了。
I should ask how they are mapped to physical machine?
基本上是一对一的。
关于java - JVM 堆栈、堆和线程如何映射到物理内存或操作系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16264118/