我使用 Spring 框架 (3.2.1) 的 Java 服务 (21) 遇到内存问题。
服务很简单。它公开了一个 REST 端点。
当调用此端点时,服务向另一个服务发出 HTTP 请求(使用 Spring 的 RESTCLIENT 机制)以获取数据。一旦检索到数据,就会返回。
有大量数据,因此当我调用端点时,内存使用量出现峰值,这并不令我感到惊讶。
但是,一旦处理完成,内存就会保持在高位并且永远不会下降。
这是 VisualVM 的屏幕截图:
内存一直保持在高位,直到我在 VisualVM 中单击“执行 GC”。我试过了,即使24小时后,即使没有人呼叫我的端点,内存仍然保持高位。
这里有更多信息:
您知道问题的根源和可能的解决方案吗?
提前谢谢您
这是正常行为。 Java 垃圾收集器旨在最小化两个指标:
最小化总体内存利用率不是主要目标。
在您的示例中,您使用的 G1GC 具有(隐式或显式)最大暂停时间。 JVM 发现大约有 1GB 的可用堆空间,并估计它不需要触发 GC 来仍然满足暂停时间保证。 所以它不会...因为在没有足够垃圾的情况下运行GC效率很低。