Java Spring 服务的内存/垃圾收集器问题

问题描述 投票:0回答:1

我使用 Spring 框架 (3.2.1) 的 Java 服务 (21) 遇到内存问题。

服务很简单。它公开了一个 REST 端点。

当调用此端点时,服务向另一个服务发出 HTTP 请求(使用 Spring 的 RESTCLIENT 机制)以获取数据。一旦检索到数据,就会返回。

有大量数据,因此当我调用端点时,内存使用量出现峰值,这并不令我感到惊讶。

但是,一旦处理完成,内存就会保持在高位并且永远不会下降。

这是 VisualVM 的屏幕截图:

enter image description here

内存一直保持在高位,直到我在 VisualVM 中单击“执行 GC”。我试过了,即使24小时后,即使没有人呼叫我的端点,内存仍然保持高位。

这里有更多信息:

  • 该服务在 Docker 容器中运行。使用的图像是3.9.5-eclipse-temurin-21
  • 我尝试过调整 JVM 参数:
    • 不带任何参数
    • -Xms128m -XX:+使用G1GC -Xmx3g
    • -Xms128m -XX:+UseG1GC -Xmx3g -XX:MaxGCPauseMillis=200 在这三种情况下,问题仍然存在

您知道问题的根源和可能的解决方案吗?

提前谢谢您

java spring memory memory-leaks garbage-collection
1个回答
0
投票

这是正常行为。 Java 垃圾收集器旨在最小化两个指标:

  • 垃圾收集器的 CPU 利用率,或
  • “停止世界”在垃圾收集器运行时暂停。

最小化总体内存利用率不是主要目标。

在您的示例中,您使用的 G1GC 具有(隐式或显式)最大暂停时间。 JVM 发现大约有 1GB 的可用堆空间,并估计它不需要触发 GC 来仍然满足暂停时间保证。 所以它不会...因为在没有足够垃圾的情况下运行GC效率很低。

© www.soinside.com 2019 - 2024. All rights reserved.