我们将 Spring Boot 从 2.3.0.RELEASE 升级到 2.5.13 我们使用的 spring cloud 版本是 spring-cloud-sleuth( 2.0.0.RELEASE) 并升级到 spring-cloud-dependencies (version-2020.0.5) 升级后堆内存使用量急剧增加,从 heapdump 分析看到下面的对象正在内存中累积。 “org.springframework.boot.actuate.autoconfigure.metrics.AutoConfiguredCompositeMeterRegistry”
如果有人遇到/知道这个问题,或者请帮助我了解导致此问题的可能原因。 Eclipse 分析器结果图像
请告诉我有关此问题所需的任何其他信息。
通过在互联网上进行一些挖掘,我得到了一篇帖子,它帮助我识别了问题。
避免使用 Spring Boot 的 WebClient 和 uriBuilder 来执行 Web 请求。
webClient .get()
.uri(uriBuilder -> uriBuilder.path("/v2/products/{id}")
.build(productId))
使用以下内容来构造 URI:它将避免这种内存泄漏。
webClient .get()
.uri("/v2/products/{id}", productId))
在这里为更广泛的受众分享这篇文章。
这里也有类似的情况。解决这个问题的方法是停用通过 ID 收集指标。
默认情况下,考虑到某些 ID,Spring Boot 指标(Micrometer 作为 Facade)被激活以进行收集。使用WebClient、RestTemplate等都没关系
management.metrics.enable - 是否接受具有特定 ID 的计量表。不接受的电表将从 MeterRegistry 中过滤掉。
你可以看到PropertiesMeterFilter.java,accept()方法。
@Override
public MeterFilterReply accept(Meter.Id id) {
boolean enabled = lookupWithFallbackToAll(this.properties.getEnable(), id, true);
return enabled ? MeterFilterReply.NEUTRAL : MeterFilterReply.DENY;
}
正确的方法是确定 Spring Boot 工件是否正在使用指标,以及是否确实有必要使用每个“id”来识别每个请求。如果是这样,但保存每个 id 并不重要,请尝试直接在 .properties 文件或 .yaml 文件中停用它
应用程序属性
management.metrics.enable=false
application.yaml
management:
metrics:
enable: false