【问题标题】:Is there any advantage in setting Xms and Xmx to the same value?将 Xms 和 Xmx 设置为相同的值有什么好处吗?
【发布时间】:2017-09-24 20:36:00
【问题描述】:

通常我设置-Xms512m-Xmx1g 以便在JVM 启动时分配512MB 并根据需要逐渐将堆增加到1GB。但是我看到这些值在专用服务器实例中设置为相同的1g。将两者设置为相同的值有什么好处吗?

【问题讨论】:

标签: jvm heap-memory


【解决方案1】:

嗯,有几件事。

  1. 程序将从 -Xms 值开始,如果该值较小,最终将迫使 GC 更频繁地发生
  2. 一旦程序到达 -Xms 堆,jvm 会向操作系统请求额外的内存并最终抓取需要额外时间导致性能问题的 -Xmx,您不妨一开始就将其设置为避免 jvm 请求额外的内存。

这里得到了很好的回答 - https://developer.jboss.org/thread/149559?_sscc=t

【讨论】:

  • 我不确定 2010 年的帖子是否是今天的有效来源。从那时起发生了很多事情。
【解决方案2】:

来自 Oracle Java SE 8 文档:

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html 默认情况下,虚拟机在每个 收集尽量保持空闲空间与活动对象的比例 在特定范围内的每个集合中。此目标范围已设置 通过参数-XX:MinHeapFreeRatio=<minimum> 和百分比表示 -XX:MaxHeapFreeRatio=<maximum>,总大小以 -Xms<min> 为界,以-Xmx<max> 为界。将-Xms-Xmx 设置为相同的值会通过删除最重要的大小来提高可预测性 由虚拟机决定。但是,虚拟机是 如果您做出错误的选择,则无法补偿。

如果 -Xms 和 -Xmx 的值相同,则 JVM 将不必调整堆大小,这意味着 JVM 的工作更少,应用程序的时间更多。但是如果选择的值对于 -Xms 来说是一个糟糕的选择,那么分配的一些内存将永远不会被使用,因为堆永远不会缩小,如果它对于 -Xmx 来说是一个糟糕的选择,你会得到 OutOfMemoryError。

【讨论】:

    【解决方案3】:

    AFAIK 还有一个原因,堆扩展是stop-the-world 事件;将它们设置为相同的值将防止这种情况发生。

    【讨论】:

      【解决方案4】:

      有一些优点。

      • 如果您知道大小将增长到最大,例如在基准测试中,您不妨从您知道自己需要的尺寸开始。
      • 您可以获得更好的性能,给程序更多的内存,它可能会自然地给自己。 YMWV

      一般来说,我会将 Xms 设为一个我确信它会使用的值,并将这个值加倍,以便为未来的用例或我们尚未测试的情况留出空间。即我们不期望但它可能会使用的大小。

      简而言之,最大值是您宁愿程序失败也不愿再使用的点。

      【讨论】:

        【解决方案5】:
        1. 应用程序将遭受频繁 GC 且 -Xms 值较低。
        2. 每次向操作系统请求更多内存都会消耗时间。
        3. 最重要的是,如果您的应用程序对性能至关重要,那么您当然希望避免内存页面换出到磁盘或从磁盘换出,因为这会导致 GC 消耗更多时间。为避免这种情况,可以锁定内存。但如果 Xms 和 Xmx 不相同,则初始分配后分配的内存不会被锁定。

        【讨论】:

          猜你喜欢
          • 2011-11-19
          • 1970-01-01
          • 2013-04-11
          • 2017-05-08
          • 2022-01-12
          • 2011-05-17
          • 2022-01-10
          • 2011-09-03
          • 1970-01-01
          相关资源
          最近更新 更多