编译器书(龙书)解释说,值类型在栈上创建,引用类型在堆上创建。
对于Java,JVM在运行时数据区中也包含了堆和栈。对象和数组在堆上创建,方法帧则被推入栈中。一个堆由所有线程共享,而每个线程都有自己的栈。以下图表显示了这一点:
更多关于Java运行时数据区域的内容。
我不理解的是,既然JVM本质上是软件,那么这些JVM堆、栈和线程如何映射到物理机器上呢?
如果有人能比较Java和C++之间的这些概念就好了。因为Java运行在JVM上,而C++则不是。
为了使这个问题更加精确,我想知道以下几点:
- 与Java相比,C++的运行时数据区域看起来是什么样子的?图片将会很有帮助,我找不到像上面JVM那张好的图片。
- JVM堆、栈、寄存器和线程是如何映射到操作系统的?或者说它们是如何映射到物理机器的?
- 每个JVM线程是否只是一个用户线程,并以某种方式映射到内核中?(用户线程与内核线程)
更新:我为进程的运行时物理内存绘制了一张图片。