如何控制JVM堆使用率,尽可能保持在80%以下?

how to control jvm heap usage rate to stay below 80% as much as possible?

提问人:skycaptain 提问时间:11/13/2023 更新时间:11/13/2023 访问量:54

问:

我们的springboot应用程序用于获取大数据并对其进行压缩。所以它总是需要大内存。但客户的 Prometheus 始终监控它并向我们发送警报堆内存使用率超过 80%。虽然我们知道它不会哎呀并重新启动......但是我们解释起来很无聊,所以我们尽量让GC提前发生,避免阈值80%。当然,尽可能多地,但不是绝对的。

附言: JDK1.8 -XX:+UseG1GC -XX:MaxRAMPercentage=75

Java spring-boot 内存 垃圾回收 g1gc

评论

4赞 Stephen C 11/13/2023
“但客户的 Prometheus 始终监控它并向我们发送警报,堆内存使用率超过 80%。”- 我认为最好的办法是告诉您的客户调整他们的警报级别或减少最大堆大小。
3赞 user207421 11/13/2023
压缩大型对象不需要大量内存。它始终可以以流式处理方式完成。检查你的假设。

答:

0赞 aled 11/13/2023 #1

如果确保应用程序不在堆中创建对象,则堆内存的使用量不应增加。这通常是不切实际的,在现实生活中也不可行。

您可以分析并尝试最小化内存的使用及其在内存中保留的时间。但是,不能保证您会取得多大的成功。

话虽如此,这是由于用户对 JVM 内存的工作方式以及如何监控它的错误期望而导致的常见情况。教育您的客户可能很有用。

另一种选择是在现实生活中监控应用程序的内存模式,并根据这些条件调整监控警报。

评论

0赞 skycaptain 11/13/2023
用户会向我们的应用程序发送许多请求,然后应用程序将持续从数据库中提取数据。因此,它会经常在堆中创建对象。我们知道超过 80% 是很常见的,但向那些对 java 一无所知的人解释它很无聊,所以我们试图减少警报数量,例如 .通过在达到 75% 时强制 GC .
0赞 aled 11/13/2023
解释某事很无聊,这不是一个好的技术原因。强制将 GC 强制设置为堆的固定百分比可能会影响性能。您是否使用不同的配置执行了基准测试,以了解更改的影响?