【问题标题】:What does it mean that "the memory requested by JVM from the OS has to be contiguous"?“JVM从操作系统请求的内存必须是连续的”是什么意思?
【发布时间】:2023-03-23 13:10:01
【问题描述】:

我在网上看到很多人声称“JVM 在启动时向操作系统请求一个连续的未分段内存块”。 我无法理解的是这与虚拟内存的概念有何关联。

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

至于进程的虚拟内存 - 从进程的角度来看,它始终是“连续的”,因为每个进程都有自己的地址空间。

因此,我想了解的是:

  • OS 分配给 JVM 的内存是否必须是语句
    连续真的是真的吗?
  • 如果是这样,考虑到它,操作系统如何确保内存保持连续 可能会被换出到磁盘并换回 RAM?
  • 如果陈述不正确,操作系统的原因可能是什么
    会拒绝进程请求的虚拟内存吗?内存
    过度使用设置?

【问题讨论】:

    标签: java memory-management operating-system jvm


    【解决方案1】:
    1. JVM 为different purposes 分配内存。当然,这不仅仅是一块内存。一些 JVM 结构需要占用一个连续的块,而另一些则不需要。

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

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

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

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

    【讨论】:

    • 感谢您的澄清。关于第 4 点,我无法理解的是进程的虚拟地址空间如何在 JVM 有机会启动之前变得碎片化(这似乎是一些“无法为对象堆保留足够空间”错误的情况) ?可能是因为某些共享库被加载到虚拟内存中的固定地址吗?还有其他原因吗?
    • @NikitaTkachenko 没错,当 JVM 分配 Java Heap 时,已经加载了许多共享库(虽然不是固定地址)。
    • @NikitaTkachenko 请注意,为确保指定的最大堆大小保持连续,必须在启动时保留关联的逻辑地址范围,因此即使 Java 应用程序也无法用于本机代码实际上并没有使用它。因此,对于 HotSpot JVM 的 32 位实例,不仅在启动时加载的库,而且您可能希望稍后加载的库都是/是问题。即使在 JVM 启动之前,您也必须/必须仔细做出正确的权衡。
    猜你喜欢
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多