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

Java JVM堆栈、堆和线程如何映射到物理内存或操作系统,java,c++,memory,jvm,runtime,Java,C++,Memory,Jvm,Runtime,编译手册(龙书)解释说,值类型是在堆栈上创建的,引用类型是在堆上创建的 对于Java,JVM还包含运行时数据区域中的堆和堆栈。对象和数组在堆上创建,方法框架被推送到堆栈中。一个堆由所有线程共享,而每个线程都有自己的堆栈。下图显示了这一点: 更多关于 我不明白的是,既然JVM本质上是一个软件,那个么这些JVM堆、堆栈和线程是如何映射到物理机器的呢 如果有人可以比较java和C++之间的概念,我会很感激。因为java在JVM上运行,C++没有。p> 为了使这个问题更加准确,我想知道以下几点: 与j

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

对于Java,JVM还包含运行时数据区域中的堆和堆栈。对象和数组在堆上创建,方法框架被推送到堆栈中。一个堆由所有线程共享,而每个线程都有自己的堆栈。下图显示了这一点:

更多关于

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

如果有人可以比较java和C++之间的概念,我会很感激。因为java在JVM上运行,C++没有。p> 为了使这个问题更加准确,我想知道以下几点:

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

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

    堆是预先分配的连续虚拟内存区域。e、 g

     void* heap = malloc(Xmx); // get the maximum size.
    

    线程启动时,线程库会分配堆栈。同样,它是虚拟内存的一个连续区域,是最大堆栈大小。你也可以把它看作是

     void* stack = malloc(Xss); // get the maximum stack size.
    
    本机线程是不属于JVM空间的操作系统特性

    因为java在JVM上运行,C++不运行。 C++仍然需要运行时环境和库才能启动。尝试删除C++运行时或LIBC,这些不能启动。 <> P>与java相比,C++运行时数据区域是什么样子? 您可以使用一个很大的虚拟内存区域。没有照片,因为它不会告诉你太多。想象一个长矩形标记为用户空间

    JVM堆、堆栈、寄存器和线程如何映射到操作系统?或者我应该问它们是如何映射到物理机器的

    同样,没有魔法。JVM堆是一个内存区域,JVM堆栈与C+使用的本机堆栈相同,JVM的寄存器与C+使用的本机寄存器相同,JVM线程实际上是C+使用的本机线程

    我想你是在假设有比现在更神奇或更晦涩的事情发生。相反,您应该假设已经使用了最简单、高效和轻量级的设计,并且您离此不远了

    我应该问一下它们是如何映射到物理机器的


    基本上是一对一。

    大多数线程只是映射到操作系统线程,在这一点上,它们会得到自己的堆栈,与操作系统上的任何线程一样。@radai太好了,谢谢您的评论!你能通过比较java和C++来说明更多吗?我在C++中不太懂,真的可以进行比较,我只知道java端。非常感谢。在您的回答中,您所说的“已标记的用户空间”是指已标记的每个进程吗?JVM线程映射到内核“一对一”?本机线程堆栈位于进程的用户空间内存中。若不包括这些,我不知道你们所说的“JVM空间本身”是什么意思。JVM堆的内存是从代表JVM的OS进程的数据段分配的,对吗?我的假设是,jvm本质上只是一个进程,每个进程都有文本、数据和堆栈段,malloc()本质上从数据段获取一块内存。我说的对吗?HotSpot JVM为堆获取了一个大的连续虚拟内存区域,它可以使用
    malloc
    来实现这一点。通过“数据”段,我假设您谈论的是x86与8086用于寻址更多内存的不同段。好了,这些并没有真正发挥作用,JVM在没有这些的架构上运行。“当线程启动时,堆栈由线程库分配。同样,它是一个连续的虚拟内存区域”-而不是根据:
    Java虚拟机堆栈的内存不需要是连续的。