这两天做压力测试(服务器是IBM P750 8C 32G),高并发下如果用反射直接调用一个简单的服务(空方法,直接return)TPS大概能到将近300,如果用Spring的applicationContext getBean来获取服务对象调用的话(服务bean是prototype类型),TPS只有不到90。
在日志里记录了一下执行时间,用反射调用服务执行时间基本在10毫秒以内,但是用Spring的ApplicationContext执行时间在1秒左右。
这样的问题是不是cglib代理引起的?有什么解决办法?
Spring 的bean的scope设置成prototype, 就是每次都要创建一个实例, 可以看一下Spring的源码, 创建一个Spring实例是很复杂的一个过程, CGlib代理只是其中的一步,底层也是通过反射完成的, 我觉得耗时的关键不在 CGlib代理, 而是在整个Spring加载和实例化bean的过程。 通常情况下使用Spring来管理bean都是将scope设置成singleton, 这样bean实例就是一个单例, 不用每次getBean时都实例化一遍。 具体能不能用singleton要看你的实际应用场景了。
官方帮助文档地址:阿里云帮助中心
更多参考: 阿里云官方(新用户需官网注册查看)
Spring 的bean的scope设置成prototype, 就是每次都要创建一个实例, 可以看一下Spring的源码, 创建一个Spring实例是很复杂的一个过程, CGlib代理只是其中的一步,底层也是通过反射完成的, 我觉得耗时的关键不在 CGlib代理, 而是在整个Spring加载和实例化bean的过程。 通常情况下使用Spring来管理bean都是将scope设置成singleton, 这样bean实例就是一个单例, 不用每次getBean时都实例化一遍。 具体能不能用singleton要看你的实际应用场景了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。