Java -Xms 初始大小效果

Java -Xms initial size effects

提问人:SyBer 提问时间:3/28/2010 最后编辑:trincotSyBer 更新时间:7/31/2021 访问量:55395

问:

设置 -Xms 参数有什么好处,例如,让初始内存更大,然后是默认计算的内存(在我的情况下为 64 MB,根据 Java GC tunning: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#par_gc.ergonomics.default_size)?

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

谢谢。

java 垃圾回收 堆内存

评论


答:

33赞 Phil 3/28/2010 #1

这样做的好处是,当您用完足够多的堆而必须调整其大小时,性能会受到损失。如果您最初将其设置为 64MB,但事实证明您的应用程序在负载下需要 250MB,当您达到接近 64MB 时,JVM 将分配更多的堆空间,并可能在一些对象周围移动并执行其他簿记。这当然需要时间。

当应用程序处于负载状态时,您希望所有资源都专用于使其运行,因此这种额外的工作可能会使应用程序的响应速度变慢,甚至在某些情况下,如果在调整堆大小之前内存不足,它也会崩溃。

有时,在使用 Java 应用程序时,您会看到诸如“设置和设置为相同值”之类的说明。这样做是为了完全避免调整大小,以便您的应用程序在启动时其堆已经与以往一样大。XmsXmx

评论

1赞 SyBer 3/28/2010
根据您的经验,是否建议将 Xms 设置为与 Xmx 相同的值?
7赞 Phil 3/28/2010
这取决于应用程序。如果您是一家金融机构,拥有用于一个应用程序或一组应用程序的专用服务器,那么这是有道理的。特别是因为处理市价单的应用程序每秒可能处理 100 或 1000 条消息,平均延迟为 2-25 毫秒。对于当时发送的所有订单,调整大小可能会使延迟恶化 5000%。您甚至可以放弃订单。不过,与往常一样,在尝试优化之前先进行分析。
0赞 Jé Queue 4/22/2010
应该注意的是,对于具有大量活动 JVM 的系统,-Xms 将增加平均 JVM 占用空间,而允许 JVM 自行管理其堆分布允许采用内存占用收集方案。
2赞 Mark Booth 7/12/2011
@Phil,这是一个很好的答案,但如果你对 SyBer 问题的评论被折叠到原始答案中会更好。
6赞 Roman 3/28/2010 #2

链接的文章解释得很清楚:

默认值:-Xms 3670k -Xmx 64分钟 [...] 大 服务器应用程序经常遇到 这些默认值有两个问题。一 启动缓慢,因为初始 堆很小,必须调整大小 许多主要收藏品。一个 更多 紧迫的问题是默认 最大堆大小不合理 对于大多数服务器应用程序来说,体积较小。 服务器的经验法则 应用包括:

  1. 除非你有问题 暂停,尝试授予尽可能多的内存 尽可能添加到虚拟机。 默认大小 (64MB) 通常也是如此 小。
  2. 将 -Xms 和 -Xmx 设置为 相同的值可提高可预测性 通过删除最重要的 来自虚拟的规模决策 机器。但是,虚拟 然后机器无法补偿 如果你做了一个糟糕的选择。
  3. 一般来说,增加内存 增加处理器的数量, 由于分配可以是 并行。

您也可以对这个问题的讨论感兴趣。

3赞 Tomislav Nakic-Alfirevic 3/28/2010 #3

如果应用程序需要超过 64 MB 的堆内存是正常的,则将 Xms 设置为更大的值应该会在一定程度上提高应用程序的性能,因为 VM 不必多次请求额外的内存。

在生产系统中,我认为将 Xms 和 Xmx 设置为相同的值是明智的。它基本上是在说“这是 VM 可以获得的堆内存量,我马上就把它奉献出来”。

4赞 Pascal Thivent 3/28/2010 #4

设置 -Xms 参数有什么好处,例如,初始内存更大,然后是默认计算的内存

如果初始堆很小,并且必须在许多主要集合上调整大小,则启动速度会很慢。

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

将 和设置为相同的值可为您提供可预测性。在性能调优期间调整 JVM 的大小时,这一点尤为重要。但是JVM无法弥补任何错误的决定。-Xms-Xmx

我倾向于对生产服务器使用相同的值(在性能测试期间进行了调整)。

评论

0赞 emilly 9/23/2016
您能谈谈您对 stackoverflow.com/questions/39652282/ 的看法吗?stackoverflow.com/questions/39652282/......?提前致谢