JVM 级别内存使用率高 - org.springframework.boot.actuate.autoconfigure.metrics.AutoConfiguredCompositeMeterRegistry

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

我们将 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 jvm heap-memory spring-cloud spring-actuator
2个回答
0
投票

通过在互联网上进行一些挖掘,我得到了一篇帖子,它帮助我识别了问题。

避免使用 Spring Boot 的 WebClient 和 uriBuilder 来执行 Web 请求。

  webClient .get() 
          .uri(uriBuilder -> uriBuilder.path("/v2/products/{id}")
          .build(productId))

使用以下内容来构造 URI:它将避免这种内存泄漏。

 webClient .get()
       .uri("/v2/products/{id}", productId))

在这里为更广泛的受众分享这篇文章。


0
投票

这里也有类似的情况。解决这个问题的方法是停用通过 ID 收集指标。

Heap Dump with the problem

默认情况下,考虑到某些 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

您还可以查看 Micrometer 文档,了解 MeterFilter.java 行为

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