【问题标题】:Do the -Xms and -Xmx flags reserve the machine's resources?-Xms 和 -Xmx 标志是否保留机器的资源?
【发布时间】:2017-09-04 06:58:00
【问题描述】:

我知道JVM进程的-Xms标志是允许JVM进程使用特定数量的内存来初始化它的进程。而关于 Java 应用程序的性能,通常建议在启动应用程序时将-Xms-Xmx 设置为相同的值,例如-Xms2048M -Xmx2048M

我很好奇 -Xms-Xmx 标志是否意味着 JVM 进程预留了特定数量的内存以防止同一台机器上的其他进程使用它。

是这样吗?

【问题讨论】:

  • @PeterLawrey 感谢您的编辑。

标签: java jvm


【解决方案1】:

Xmx 只保留虚拟地址空间。 Xms 实际上分配(提交)它但不一定预先设置它。

操作系统对分配的响应方式各不相同。

Windows 确实允许您保留非常大的地址空间块 (Xmx),但不允许过度使用 (Xms)。限制由交换 + 物理定义。例外情况是大页面(需要通过组策略设置启用),这将受到物理内存的限制。

Linux 的行为更加复杂,它依赖于vm.overcommit_memory 和相关的sysctls 以及传递给mmap syscall 的各种标志,这在一定程度上可以通过JVM 配置标志来控制。行为范围从 a) Xms 可以超过总内存 + 交换到 b) Xmx 被可用的物理内存限制。

【讨论】:

  • 有趣...-XX:+AlwaysPreTouch不应该在使用时预置内存吗?
  • @Eugene 当然,因此“不一定”
【解决方案2】:

简短回答:取决于操作系统,但在所有流行的操作系统中绝对是“否”。

我将在这里以 Linux 的内存分配术语为例。

-Xms 和 -Xmx 指定 JVM 堆的最小和最大大小。这些大小反映了虚拟内存分配,可以随时物理映射到 RAM 中的页面,称为进程的 RESIDENT SIZE。

当 JVM 启动时,它会分配 -Xms 数量的虚拟内存。一旦您在堆上动态创建更多对象,这可以映射到常驻内存(物理内存)。此操作不需要 JVM 向操作系统请求任何新分配,但会增加 RAM 利用率,因为这些虚拟页面现在实际上也有相应的物理内存分配。但是,一旦您的进程在使用 RAM 上的所有 Xms 分配后尝试在堆上创建更多对象,它必须向操作系统请求更多来自操作系统的虚拟内存,稍后可能/可能不会映射到物理内存,具体取决于何时你需要它。对此的限制是您的 -Xmx 分配。

请注意,这一切都是可能的,因为 linux 中的内存是共享的。因此,即使进程事先分配了内存,它所获得的只是虚拟内存,它只是一个可寻址的连续虚构分配,根据需求可能会或可能不会映射到真实的物理页面。阅读this answer,了解内存管理在流行操作系统中的工作原理的简短描述。 Here 是关于 Linux 内存管理工作原理的非常详细(有点过时但非常有用)的信息。

还要注意,这些标志只影响堆大小。您将看到的常驻内存大小将大于当前 JVM 堆大小。更具体地说,JVM 消耗的内存等于它的 HEAP SIZE 加上 DIRECT MEMORY,它反映了来自方法堆栈、本机缓冲区分配等的东西。

【讨论】:

    【解决方案3】:

    JVM 进程是否会预留特定数量的内存?

    是的,JVM 在开始时保留Xms 指定的内存,最多可能保留Xmx,但保留不必在物理内存中,也可以在交换中。 JVM 页面将根据需要换入和换出内存。


    为什么建议 Xms 和 Xmx 具有相同的值?

    注意:对于机器专用于单个应用程序(或者没有多少应用程序竞争系统资源)的生产系统,通常建议设置 XmsXmx。这并不能概括它在任何地方都是好的。

    避免堆大小:

    JVM 以最初由Xms 值指定的堆大小开始。当堆由于应用程序分配对象而耗尽时。 JVM 开始增加堆。每次 JVM 增加堆大小时,它都必须向操作系统请求额外的内存。这是一个耗时的操作,并会导致 gc 暂停时间增加,从而缩短请求的响应时间。

    应用程序的长期行为:

    尽管我无法一概而论,但从长远来看,许多应用程序最终会增长到最大堆值。这是从最大内存开始而不是随着时间的推移增加堆并产生不必要的堆调整开销的另一个原因。这就像要求应用程序在开始时占用它最终会占用的内存。

    GC 数量:

    从较小的堆大小开始会导致更频繁地进行垃圾收集。更大的堆大小会减少发生的 gcs 数量,因为有更多内存可用于对象分配。但是必须注意,增加堆大小会增加 gc 暂停时间。仅当您的垃圾收集已正确调整并且暂停时间不会随着堆大小的增加而显着增加时,这才是一个优势。

    这样做的另一个原因是服务器通常带有大量内存,那么为什么不使用可用的资源呢?

    【讨论】:

    • -Xms 是区域配置为适合其中的内存大小。如果您有大量未使用的永久空间,则实际出现故障的大小可能要小得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2011-05-17
    • 2013-01-23
    相关资源
    最近更新 更多