将XMS和XMX设置为相同的值是否有任何优势



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

有几件事。

  1. 程序将以-XMS值开头,如果值较小,则最终将迫使GC发生更频繁地发生
  2. 一旦程序到达-XMS堆,JVM请求OS以获取其他内存,并最终抓取需要额外的时间导致性能问题的-XMX,您不妨在开始时将其设置为避免JVM要求其他内存。<<<<<<<<<<<<。/li>

在这里很好地回答-https://developer.jboss.org/thread/149559?__sscc = t

来自Oracle Java SE 8 docs:

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。

afaik的另一个原因是,堆的扩展是stop-the-world事件;将它们设置为相同的值将阻止这一点。

有一些优点。

  • 如果您知道大小会增长到最大值,例如在基准测试中,您最好从知道所需的大小开始。
  • 您可以获得更好的性能,从而为程序提供更多的记忆,以便自然而然地赋予自己。ymwv

通常,我会让XMS成为我有信心使用的价值,而将其用于头部空间的两倍,用于将来的用例或我们尚未测试的情况。即我们不希望的尺寸,但可能会使用。

简而言之,最大值是您希望程序失败而不是再使用任何其他方法。

  1. 应用将遭受频繁的GC,其值较低。
  2. 每次要求使用消耗时间的操作系统要求更多内存。
  3. 最重要的是,如果您的应用程序的性能至关重要,那么您肯定希望避免将内存页面交换到/从磁盘交换,因为这会导致GC消耗更多的时间。为了避免这种情况,可以锁定内存。但是,如果XMS和XMX不相同,则在初始分配后分配的内存将不会锁定。

最新更新