不提供 Xms JVM 参数的缺点是什么?

What are the downsides of not providing the Xms JVM parameter?

我正在寻找一种策略来为我 运行.

的应用程序调整 JVM 参数

该应用程序本身是一个网络应用程序,大多数时候不会做太多事情,也不需要太多内存。假设300MB。时不时地,外部的某些东西会触发大量繁重的处理,偶尔需要更多的内存。假设 1400 MB。

我 运行 在 JDK 15 上,在 kubernetes 集群中的 pod 上没有任何其他 JVM 参数。

我想:

在寻找答案时,经常弹出的建议是设置 Xmx 参数。我明白为什么,这对我来说很有意义。

但是还有一个常见的建议让我很困惑。也就是设置Xms参数,设置equal to the Xmx参数。

这几周我把这两个参数都设置了,而且配置一样,都是1400M。

我得出的结论是一切都运行顺利并且看起来可以预见。我不喜欢的是 JVM 一直保留 1400MB 内存(这正是我假设的 Xms 参数),永久占用底层系统的 2.2 GB。

让我们看看当我删除 Xms 参数并仅将 Xmx 设置为 1400 时会发生什么:

在这里您可以更清楚地看到应用程序的典型行为。 JVM 为堆保留/提交多少内存取决于实际使用了多少。它大部分时间都很低,在繁重的处理过程中会爬升和下降。

我的问题是:为什么要设置Xms参数?没有它的行为看起来更有效率。有没有我遗漏的缺点?

如果其他一些应用程序预留了太多内存,您的应用程序将在下一个高峰期间没有足够的内存。

如果保留大小不变,管理员可以更好地估计内存使用情况。

一次保留的内存很可能碎片较少。

但是设置 Xms 参数有一个缺点(除了明显的那个):垃圾收集器等待更长时间,直到它开始收集。垃圾收集开销更少,但更重。 CPU 性能在这种情况下不太稳定。在某些情况下,它可能会导致世界停止暂停(例如,如果你有很多 RAM 但很弱CPU)