@RefreshScope竟然影响性能

简介: @RefreshScope竟然影响性能

概述


最近公司在某个银行项目POC的时候,需要压测某个接口,这个接口用来接入行内所有业务场景的流水,所以对tps的要求非常高,但是在我们用jmeter做压测的过程中,发现tps一直上不去,如下图所示,可以看到tps一直在1w7左右,那么究竟是什么原因导致的呢,让我们来一探究竟吧。

1671173331716.jpg


排查思路


1.首先通过jsatck命令行工具查看应用的线程,发现了存在着大量的blocked线程。

jstack pid

2.查看具体的blocked线程,可以看到堆栈信息,如下图所示:

1671173342723.jpg


原因分析


分析堆栈信息,发现调用GenericScope的get方法时,最后会调用到ConcurrentHashMap的putIfAbsent()方法,而ConcurrentHashMap是一个并发容器,会存在资源竞争,特别是在并发度非常非常高的情况下,竞争就会比较大,导致最终一些线程出现阻塞的情况,从而影响了性能。 性能问题。

1671173350688.jpg

1671173357343.jpg

而GenericScope是由于@RefreshScope导致的,@RefreshScope主要是用来实现配置的自动刷新,而这个注解引入的时候,会发生调用GenericScope的get方法,具体的源码解析可以参考这篇源码分析的文章:一文带你理解@RefreshScope注解实现动态刷新原理


解决办法


  1. 去掉了@RefreshScope这个注解。
  2. 改读取配置通过采用@ConfigurationProperties这个注解。 最终tps提升到了4.4w。

1671173366401.jpg


总结


该性能瓶颈一般出现在超高并发的场景下,一般生产不会出现压测这么高的并发,所以大部分的场景使用RefreshScope都是没有问题的。

但是,还是建议大家读取配置尽量都优先使用@ConfigurationProperties这个注解。

目录
相关文章
|
存储 编译器
深入解析i++和++i的区别及性能影响
在我们编写代码时,经常需要对变量进行自增操作。这种情况下,我们通常会用到两种常见的操作符:i++和++i。最近在阅读博客时,我偶然看到了有关i++和++i性能的讨论。之前我一直在使用它们,但从未从性能的角度考虑过,这让我突然产生了兴趣。尽管它们看起来相似,但它们之间存在微妙而重要的区别。在本文中,我们将详细解释i++和++i之间的区别,以及它们对代码性能的影响。
429 1
深入解析i++和++i的区别及性能影响
|
3月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
136 4
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
5月前
|
存储 数据采集 Java
Spring Boot 3 实现GZIP压缩优化:显著减少接口流量消耗!
在Web开发过程中,随着应用规模的扩大和用户量的增长,接口流量的消耗成为了一个不容忽视的问题。为了提升应用的性能和用户体验,减少带宽占用,数据压缩成为了一个重要的优化手段。在Spring Boot 3中,通过集成GZIP压缩技术,我们可以显著减少接口流量的消耗,从而优化应用的性能。本文将详细介绍如何在Spring Boot 3中实现GZIP压缩优化。
586 6
|
7月前
|
Java Spring
Spring初始化加速的思路和方案问题之在BeanFactory#doGetBean方法中,栈状态的变化影响bean的初始化的问题如何解决
Spring初始化加速的思路和方案问题之在BeanFactory#doGetBean方法中,栈状态的变化影响bean的初始化的问题如何解决
|
6月前
|
缓存 数据可视化 安全
Lettuce的特性和内部实现问题之Lettuce在连接池模式下的整体性能表现偏低的问题如何解决
Lettuce的特性和内部实现问题之Lettuce在连接池模式下的整体性能表现偏低的问题如何解决
220 0
|
7月前
@Builder 注解问题之注解增加了不必要的复杂度如何解决
@Builder 注解问题之注解增加了不必要的复杂度如何解决
|
8月前
|
Java 测试技术 Spring
|
9月前
|
容器
多线程时Autowired自动注入问题
多线程时Autowired自动注入问题
238 2
|
缓存 Java 容器
九.Spring源码剖析-Autowired自动注入原理
这篇文章接上一篇文章属性注入讲一讲 @Autowired 注解的实现源码,这个也是面试被问的比较多的。
|
XML Java 数据格式
延迟初始化Bean会影响依赖注入吗
延迟初始化Bean会影响依赖注入吗
70 0