"the memory requested by JVM from the OS has to be contiguous" 是什么意思?

What does it mean that "the memory requested by JVM from the OS has to be contiguous"?

我在网上看到很多人声称 "the JVM requests a contiguous unfragmented block of memory from the OS when it starts"。 我不明白的是这与虚拟内存的概念有何关联。

OS 可能会将任何进程的内存页面换出到磁盘,然后将它们再次加载到 RAM 中 - 它们可能会加载到不同的位置,因此进程使用的物理内存将不再是连续的。

至于进程的虚拟内存 - 从进程的角度来看,它始终是 "contiguous",因为每个进程都有自己的地址 space。

因此,我想了解的是:

  1. JVM 为 分配内存。当然,这不仅仅是一块内存。有些 JVM 结构需要占用一个连续的块,有些则不需要。

  2. 如果我们谈论 HotSpot JVM 中的 Java 堆 - 是的,它是 虚拟 地址 space 的连续范围。

  3. 连续的虚拟内存不必由连续的物理内存支持。 Page table 负责将虚拟地址转换为物理地址,即使在交换后也可以将连续的虚拟地址范围映射到碎片化的物理页面等。

  4. 虽然在 64 位系统上为 Java 堆或其他 JVM 结构找到连续的虚拟地址范围通常不是问题,但在 32 位系统上这可能是一个真正的问题-位系统.

  5. 你是对的,如果进程的总虚拟内存大小超过阈值,OS 内存过量使用设置可能会导致 mmapmprotect 调用失败.