强制使用 org.springframework.aop.framework.CglibAopProxy$DynamicUnadvisedInterceptor 的最佳方法是什么?

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

我有一个基于 Spring 的高度并发 Web 应用程序,其中每个请求都会生成数百个线程,每个线程都想要访问单例 bean 和请求范围的 bean。由于对 ConcurrentHashMap 的竞争访问,以及调用代理方法时通常较高的 CPU 开销,我们在整个 Spring 代码中看到了瓶颈。

实验表明,硬编码 CglibAopProxy.getCallbacks() 以使用 DynamicUnadvisedInterceptor 而不是 DynamicAdvisedInterceptor 可以显着减少 CPU 使用率和延迟。我们的应用程序的建议 Bean 恰好为零,并且禁用建议没有已知的缺点。

我的实验涉及:

  1. 通过将 CglibAopProxy 复制到应用程序拥有的 jar 中来覆盖 CglibAopProxy,并将其放置在 spring jar 之前的类路径中。这迫使 JVM 接受我的课程。
  2. 修改代码以插入两次目标拦截器,而不是 aop 后跟目标。 地点
  3. 在开发平台上测试应用程序。

我预计性能会小幅提升,但应用程序会损坏,但我得到了很大的收益,而且应用程序看起来还不错。

实现这一点的最佳方法是什么?理想情况下不重写核心 Spring 类。 :)

编辑:建议使用Spring中的每个代理bean,这要感谢Spring本身。因此,没有受支持的方法来消除代理 bean 的开销。

spring spring-aop
1个回答
0
投票

此性能优化是通过核心 Spring 中的代码更改实现的:https://github.com/spring-projects/spring-framework/issues/32104

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