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

4 jvm heap-memory

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

Fai*_*roz 11

那么有几件事情.

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

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

  • 我不确定2010年以来的帖子是否今天是有效的消息来源。此后发生了很多事情。 (4认同)

Pet*_*rey 6

有一些优点。

  • 如果您知道大小会增长到最大(例如在基准测试中),则最好从知道所需的大小开始。
  • 您可以获得更好的性能,从而为程序提供了更多的内存,而程序自然可能会自行分配给自己。青年汽车

总的来说,我会将Xms设置为我有信心使用的值,并将其加倍以留出将来用例或未经测试的情况的余地。即我们不期望的大小,但可能会使用。

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


Eug*_*ene 5

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


小智 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。