通常我设置-Xms512m
和-Xmx1g
,以便当JVM启动时会分配512MB并根据需要将堆逐渐增加到1GB。但是我看到这些值设置为同一1g
在专用服务器实例中。将两个设置设置为相同的值有任何优势吗?
有几件事。
- 程序将以-XMS值开头,如果值较小,则最终将迫使GC发生更频繁地发生
- 一旦程序到达-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成为我有信心使用的价值,而将其用于头部空间的两倍,用于将来的用例或我们尚未测试的情况。即我们不希望的尺寸,但可能会使用。
简而言之,最大值是您希望程序失败而不是再使用任何其他方法。
- 应用将遭受频繁的GC,其值较低。
- 每次要求使用消耗时间的操作系统要求更多内存。
- 最重要的是,如果您的应用程序的性能至关重要,那么您肯定希望避免将内存页面交换到/从磁盘交换,因为这会导致GC消耗更多的时间。为了避免这种情况,可以锁定内存。但是,如果XMS和XMX不相同,则在初始分配后分配的内存将不会锁定。