将Xms和Xmx设置为相同值有什么好处吗?

时间:2017-04-27 07:23:28

标签: jvm heap-memory

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

5 个答案:

答案 0 :(得分:10)

有很多事情。

  1. 程序将以-Xms值开头,如果值较小,最终会强制GC更频繁地发生
  2. 一旦程序到达-Xms堆,jvm请求操作系统获取额外的内存,并最终获取需要额外时间导致性能问题的-Xmx,您可以将其设置为开头,避免使用jvm来请求额外的内存。 / LI>

    这里非常好的回答 - https://developer.jboss.org/thread/149559?_sscc=t

答案 1 :(得分:5)

有一些优点。

  • 如果你知道尺寸会增长到最大,例如在基准测试中,您可以从您知道所需的大小开始。
  • 你可以获得更好的性能,为程序提供更多可能自然给予的内存。 YMWV

一般情况下,我会让Xms成为我相信它会使用的值,并且将这个值用于未来用例或我们尚未测试的情况的头部空间。即我们不期望但可能会使用的尺寸。

简而言之,最大值是您希望程序失败而不是再使用它。

答案 2 :(得分:5)

从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 :(得分:4)

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

答案 4 :(得分:0)

  1. 应用程序会经常遇到-Xms值较低的GC。
  2. 每次使用消耗的时间从操作系统中请求更多的内存。
  3. 首先,如果您的应用程序对性能至关重要,那么您肯定会希望避免将内存页面换出磁盘,因为这将导致GC消耗更多时间。为避免这种情况,可以锁定内存。但是,如果Xms和Xmx不同,则在初始分配之后分配的内存将不会被锁定。