通常我设置-Xms512m
和-Xmx1g
以便在JVM启动时分配512MB并根据需要逐渐增加堆到1GB。但是我在专用服务器实例中看到这些值设置为相同1g
。两者都设置为相同的值有什么好处吗?
答案 0 :(得分:10)
有很多事情。
这里非常好的回答 - https://developer.jboss.org/thread/149559?_sscc=t
答案 1 :(得分:5)
有一些优点。
一般情况下,我会让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)