当 JVM 启动时,它有数百甚至数千个内存区域。例如,每个线程都有一个堆栈以及一个线程状态区域。每个共享库和 jar 都有一个内存映射。注意:Java 64 位不像 16 位应用程序那样使用段。
谁分配和管理这些内存段?
所有内存映射/区域均由操作系统分配。
操作系统不知道java程序正在运行,并认为它是JVM的一部分,作为计算机上的常规程序运行,
JVM 作为常规程序运行,但内存分配使用与常规程序相同的机制。唯一的区别是,在 Java 中,对象分配是由 JVM 管理的,但这是唯一以这种方式工作的区域。
JIT 编译、Java 堆栈使用、
JIT 编译发生在普通操作系统线程中,每个 Java 堆栈都是普通线程堆栈。
这些操作需要运行时内存分配,
确实如此,而且大部分情况下它都使用malloc
and free
and map
and unmap
我不明白的是 JVM 如何将其内存划分为这些内存段
事实并非如此。堆仅适用于 Java 对象。例如,最大堆不是最大内存使用量,而是一次可以拥有的最大对象数量。
这绝对不是由操作系统完成的,并且这些内存段(例如 java 堆栈)必须是连续的才能工作
您是对的,它们需要在虚拟内存中连续,但操作系统会这样做。在Linux上至少没有使用段,只有一个32位或64位内存区域。
因此,如果 JVM 程序只是使用诸如 malloc 之类的命令来接收堆内存的最大大小并将该内存划分为段,
堆被分为几代或G1多个内存块,但这仅适用于对象。
我们不保证连续内存
垃圾收集器要么通过复制内存来对内存进行碎片整理,要么采取措施尝试减少内存,以确保您分配的任何对象都有足够的连续内存。
如果有人能帮助我在我的脑海中弄清楚这一点,我会很高兴,这一切都很混乱......
简而言之,JVM 与任何其他程序一样运行,只不过当 Java 代码运行时,它的对象被分配在托管内存区域中。所有其他内存区域的行为就像在 C 程序中一样,因为 JVM 是 C/C++ 程序。