好的,我有一个关于JVM内存段的问题, 我知道每个JVM都会选择以稍微不同的方式实现这个功能,但它是一个整体概念,应该在所有JVM中保持一致。
对于在运行时不使用虚拟机执行的标准C/C++程序,具有四个内存段:代码、栈、堆和数据。在运行时,所有这些内存段都由操作系统自动分配。
然而,当一个JVM执行Java编译程序时,在运行时它有5个内存段:
方法区 / 堆 / Java栈 / PC寄存器 / 本地栈
我的问题是,谁分配和管理这些内存段? 操作系统不知道正在运行的Java程序,并认为它是作为计算机上常规程序运行的JVM的一部分。JIT编译和Java栈使用这些操作需要运行时内存分配。我没有理解的是JVM如何将其内存划分为这些内存段。它肯定不是由操作系统完成的,而且这些内存段(例如Java栈)必须是连续的才能工作,因此如果JVM程序简单地使用诸如malloc之类的命令来接收最大堆内存大小并将该内存划分为段,则无法得到连续的内存。我希望有人能帮助我搞清楚这一点,我的想法都混乱了...
所有其他内存区域的功能都像在C程序中一样,因为JVM是一个C / C++程序。
- Markus Weninger