Java -Xms 初始大小的影响

30

-Xms参数的设置有什么好处?例如,将初始内存大小设置得比默认计算值更大(根据Java GC调整为64 MB),有何优势?(参考链接)

另外,将初始和最大内存都设置为相同的大小有什么好处吗?

谢谢。

4个回答

33

这样做的好处在于,当堆空间使用量达到需要重新调整大小时会有性能损失。如果一开始将它设置为64MB,但实际上在运行过程中应用程序需要250MB,当你接近64MB时,JVM将分配更多的堆空间,并且可能移动一些对象并进行其他簿记工作。这当然需要时间。

当应用程序正在运行时,您希望所有资源都专注于使其运行,因此这种额外的工作会使应用程序响应变慢,甚至在某些情况下,如果在堆被重新调整大小之前内存耗尽,应用程序可能会崩溃。

有时,在使用Java应用程序时,您会看到类似“将XmsXmx设置为相同值”的指令。这样做是为了避免完全调整大小,以便您的应用程序启动时,其堆已经达到最大值。


1
根据您的经验,是否建议将Xms设置为与Xmx相同的值? - SyBer
7
这取决于应用程序。如果你是一家金融机构,为一个应用程序或一组应用程序配备了专用服务器,那么这是有道理的。特别是因为一个处理市场订单的应用程序可能会处理数百或数千条信息/秒,平均延迟为2-25毫秒。调整大小可能会使该延迟恶化5000%,影响在此期间发送的所有订单。不过,在尝试优化之前,请务必进行详细分析。 - Phil
需要注意的是,对于具有大量活动JVM的系统,-Xms将增加平均JVM占用空间,而允许JVM自我管理其堆分配则可以使用内存占用集合方案。 - Jé Queue
2
@Phil,这是一个很棒的回答,但如果您对SyBer的问题的评论能够融入到原始回答中,那就更好了。 - Mark Booth

6
链接的文章已经解释得很清楚了:
默认值:-Xms 3670k -Xmx 64m [...] 大型服务器应用程序通常遇到这些默认值的两个问题。一个是启动缓慢,因为初始堆很小,必须在许多主要集合上重新调整大小。更紧迫的问题是,对于大多数服务器应用程序来说,默认的最大堆大小过小。服务器应用程序的经验法则是:
1.除非您遇到暂停问题,请尽可能向虚拟机授予更多内存。默认大小(64MB)通常太小。 2.将-Xms和-Xmx设置为相同的值通过从虚拟机中删除最重要的调整决策来增加可预测性。但是,如果您做出不良选择,则虚拟机将无法进行补偿。 3.通常情况下,随着处理器数量的增加而增加内存,因为分配可以并行化。
您还可以对此问题的讨论感兴趣。

4
-Xms参数的好处是什么?将初始内存设置得比默认计算值更大有何优点?
如果初始堆大小较小且需要在多次 major collections 期间调整大小,启动就会很慢。
同时,将初始和最大内存都设置为相同大小会有好处吗?
将 -Xms 和 -Xmx 设置为相同的值可以提供可预测性。这在调整性能期间对 JVM 的大小非常重要。但是,JVM 将无法弥补任何糟糕的决策。
我倾向于在生产服务器上使用相同的值(这些值在性能测试期间进行了调整)。

你能否提供一下你对stackoverflow.com/questions/39652282/和stackoverflow.com/questions/39652282/的看法?先谢谢了。 - emilly

3
如果您的应用程序需要超过64 MB的堆内存是正常情况,将Xms设置为更大的值应该会在一定程度上提高应用程序的性能,因为VM不必请求额外的内存那么多次。
在生产系统中,我认为将Xms和Xmx设置为相同的值是明智的。这基本上是说“这是VM可以获得的堆内存的数量,我立即进行了分配”。

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