不提供 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 实际 reserves/commits 用于堆的内存量。
- 底部的紫色线是目前实际使用了多少堆内存。
我得出的结论是一切都运行顺利并且看起来可以预见。我不喜欢的是 JVM 一直保留 1400MB 内存(这正是我假设的 Xms 参数),永久占用底层系统的 2.2 GB。
让我们看看当我删除 Xms 参数并仅将 Xmx 设置为 1400 时会发生什么:
在这里您可以更清楚地看到应用程序的典型行为。 JVM 为堆保留/提交多少内存取决于实际使用了多少。它大部分时间都很低,在繁重的处理过程中会爬升和下降。
我的问题是:为什么要设置Xms参数?没有它的行为看起来更有效率。有没有我遗漏的缺点?
如果其他一些应用程序预留了太多内存,您的应用程序将在下一个高峰期间没有足够的内存。
如果保留大小不变,管理员可以更好地估计内存使用情况。
一次保留的内存很可能碎片较少。
但是设置 Xms 参数有一个缺点(除了明显的那个):垃圾收集器等待更长时间,直到它开始收集。垃圾收集开销更少,但更重。 CPU 性能在这种情况下不太稳定。在某些情况下,它可能会导致世界停止暂停(例如,如果你有很多 RAM 但很弱CPU)
我正在寻找一种策略来为我 运行.
的应用程序调整 JVM 参数该应用程序本身是一个网络应用程序,大多数时候不会做太多事情,也不需要太多内存。假设300MB。时不时地,外部的某些东西会触发大量繁重的处理,偶尔需要更多的内存。假设 1400 MB。
我 运行 在 JDK 15 上,在 kubernetes 集群中的 pod 上没有任何其他 JVM 参数。
我想:
- 确保我的应用保持 运行
- 确保我的应用程序从底层系统占用的内存不会超过实际需要的内存 运行。
在寻找答案时,经常弹出的建议是设置 Xmx
参数。我明白为什么,这对我来说很有意义。
但是还有一个常见的建议让我很困惑。也就是设置Xms
参数,设置equal to the Xmx
参数。
这几周我把这两个参数都设置了,而且配置一样,都是1400M。
- 顶部的蓝线是底层系统(堆+其他)上总共保留了多少内存
- 它下方的黄色直线是 JVM 实际 reserves/commits 用于堆的内存量。
- 底部的紫色线是目前实际使用了多少堆内存。
我得出的结论是一切都运行顺利并且看起来可以预见。我不喜欢的是 JVM 一直保留 1400MB 内存(这正是我假设的 Xms 参数),永久占用底层系统的 2.2 GB。
让我们看看当我删除 Xms 参数并仅将 Xmx 设置为 1400 时会发生什么:
在这里您可以更清楚地看到应用程序的典型行为。 JVM 为堆保留/提交多少内存取决于实际使用了多少。它大部分时间都很低,在繁重的处理过程中会爬升和下降。
我的问题是:为什么要设置Xms参数?没有它的行为看起来更有效率。有没有我遗漏的缺点?
如果其他一些应用程序预留了太多内存,您的应用程序将在下一个高峰期间没有足够的内存。
如果保留大小不变,管理员可以更好地估计内存使用情况。
一次保留的内存很可能碎片较少。
但是设置 Xms 参数有一个缺点(除了明显的那个):垃圾收集器等待更长时间,直到它开始收集。垃圾收集开销更少,但更重。 CPU 性能在这种情况下不太稳定。在某些情况下,它可能会导致世界停止暂停(例如,如果你有很多 RAM 但很弱CPU)