【发布时间】:2017-09-24 20:36:00
【问题描述】:
通常我设置-Xms512m 和-Xmx1g 以便在JVM 启动时分配512MB 并根据需要逐渐将堆增加到1GB。但是我看到这些值在专用服务器实例中设置为相同的1g。将两者设置为相同的值有什么好处吗?
【问题讨论】:
标签: jvm heap-memory
通常我设置-Xms512m 和-Xmx1g 以便在JVM 启动时分配512MB 并根据需要逐渐将堆增加到1GB。但是我看到这些值在专用服务器实例中设置为相同的1g。将两者设置为相同的值有什么好处吗?
【问题讨论】:
标签: jvm heap-memory
嗯,有几件事。
这里得到了很好的回答 - https://developer.jboss.org/thread/149559?_sscc=t
【讨论】:
来自 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。
【讨论】:
AFAIK 还有一个原因,堆扩展是stop-the-world 事件;将它们设置为相同的值将防止这种情况发生。
【讨论】:
有一些优点。
一般来说,我会将 Xms 设为一个我确信它会使用的值,并将这个值加倍,以便为未来的用例或我们尚未测试的情况留出空间。即我们不期望但它可能会使用的大小。
简而言之,最大值是您宁愿程序失败也不愿再使用的点。
【讨论】:
【讨论】: