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

22

通常我会设置-Xms512m-Xmx1g,这样当JVM启动时,它会分配512MB,并根据需要逐渐增加堆大小到1GB。但是,在专用服务器实例中,我看到这些值都设置为同样的1g。将它们都设置为相同的值有什么优势吗?


1
可能是将JVM堆的最大值和最小值设置为相同是否好?的重复问题。 - Greg Dubicki
5个回答

25
有几件事情需要注意:
  1. 程序将以-Xms值开始,如果该值较小,则会强制更频繁地进行GC。
  2. 一旦程序达到-Xms堆,jvm请求操作系统获取额外的内存,并最终抓取-Xmx,这需要额外的时间,导致性能问题。您也可以在开始时将其设置为避免jvm请求额外的内存。
这里非常好地回答了这个问题 - https://developer.jboss.org/thread/149559?_sscc=t

8
我不确定2010年的文章在今天是否仍然是一个可靠的来源,因为那时以来发生了很多事情。 - Tobb

16

来自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。


8
据我所知,另一个原因是堆的扩展是一种“停止-全球”事件;将它们设置为相同的值将可以防止这种情况发生。

7

有一些优势。

  • 如果你知道大小会增长到最大值,比如在基准测试中,最好从你知道需要的大小开始。
  • 给程序更多的内存可以获得更好的性能。但是,结果因人而异。

通常情况下,我会将Xms设置为我有信心使用的值,并将其加倍以留出未来用例或未经测试的情况的余地。也就是说,我们不希望使用的大小,但它可能会使用。

简而言之,最大值是你宁愿让程序失败也不要再使用更多的点。


1
  1. 使用较低的-Xms值会频繁触发GC。
  2. 每次向操作系统请求更多内存都会消耗时间。
  3. 最重要的是,如果您的应用程序对性能要求很高,那么肯定要避免内存页面与磁盘进行交换,因为这将导致GC消耗更多时间。为了避免这种情况,可以锁定内存。但如果Xms和Xmx不同,则初始分配后分配的内存将无法被锁定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接