java - JVM 堆栈、堆和线程如何映射到物理内存或操作系统

标签 java c++ memory jvm runtime

编译器书(龙书)解释说,值类型是在栈上创建的,而引用类型是在堆上创建的。

对于 Java,JVM 在运行时数据区也包含堆和栈。对象和数组在堆上创建,方法帧被插入堆栈。所有线程共享一个堆,而每个线程都有自己的堆栈。下图显示了这一点:

enter image description here

更多关于 Java run-time data areas .

我不明白的是,既然 JVM 本质上是一个软件,那么那些 JVM 堆、栈和线程是如何映射到物理机的呢?

如果有人可以比较 Java 和 C++ 之间的这些概念,我将不胜感激。因为 Java 在 JVM 上运行,而 C++ 却没有。

为了让这个问题更准确,我想知道以下几点:

  1. 与 Java 相比,C++ 运行时数据区是什么样的?图片会很有帮助,我找不到像上面的 JVM 那样的好图片。
  2. JVM 堆、栈、寄存器和线程如何映射到操作系统?或者我应该问它们如何映射到物理机?
  3. 每个 JVM 线程真的只是一个用户线程并以某种方式映射到内核吗? (用户线程与内核线程)

更新: 我为一个进程的运行时物理内存画了一张图。
enter image description here

最佳答案

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/

相关文章:

java - 使用神经网络发现关系

java - 多次模拟时出现 Mockito UnfinishedStubbingException

java - 如果我的数据库关闭,取消 EhCache 中的 timeToLive 缓存过期?

c++ - C++中的空指针

c++ - 通过访问成员传回多维数组

java - 我的java概念有什么问题吗?

c++ - 对字符串使用 cin 和 getline

c++ - 你如何将这段代码从 Processing 翻译成 C++?

java - 实际示例中的内存泄漏

java - java.lang.Runtime 是报告整个 Coldfusion 服务器的内存使用情况还是只报告一页?