`
tomcat_oracle
  • 浏览: 318042 次
社区版块
存档分类
最新评论

加速Java应用调试Spring启动速度

    博客分类:
  • Java
阅读更多

在调试spring应用时,动辄几十秒,甚至有的应用上分钟的启动速度,会让整个调试速度慢下来了。等待时间让人抓狂。不知道大家是如何加速spring应用调试速度的,在此分享下我的一次加速过程。欢迎补充指正。

环境

配置:

  1. thinkpad t410 
  2. 内存:4G内存 
  3. CPU:Intel P8700 双核2.53GHZ 
  4. 系统:WIN XP 
  5. 开发工具:Intellij IDEA 12.0.4 
  6. Maven + spring3.2.3 + hibernate4.2.2+Spring data jpa 1.3.1 

未优化前spring容器启动速度:

16890毫秒 =(14609毫秒(ContextLoaderListener加载的)+2281毫秒(Springmvc加载的)

优化后spring容器启动速度:

7797毫秒 =(6563毫秒(ContextLoaderListener加载的)+1234毫秒(Springmvc加载的)

速度提升了一半多,而且以后在调试阶段,大部分就停留在这个时间左右。

注意:此处只是spring容器启动速度,不包括服务器启动时的速度。因为我的系统好久没清理了,否则可能速度会更快。

加速Spring

1、扫描注解Bean

写比较精确的扫描路径,如扫描@Service和@Repository:

  1. <context:component-scan base-package="com.sishuok.es.**.repository,com.sishuok.es.**.service,com.sishuok.es.**.extra"> 

这样写,比直接写com.sishuok.es速度要快很多,因为这样扫描的class会很少。

还有,如springmvc 扫描:

  1. <context:component-scan base-package="com.sishuok.es.**.web.controller" use-default-filters="false"> 

此处只扫描项目的web.controller包,这样扫描的class也很少。

还有如事务的扫描:

  1. execution(* com.sishuok.es..service..*+.*(..) 

还有如使用spring data jpa时也是这样:

  1. <jpa:repositories 
  2.             base-package="com.sishuok.es.**.repository" 

这里需要大家有良好的分包,否则无法优化。

2、延迟加载你的bean

常见的方式是在配置文件中在<beans>上加:

  1. default-lazy-init="true" 

2.1、这种方式只对xml声明的bean有效;

2.2、注解扫描的bean无效,如@Service,需要使用@Lazy指定,但这样太麻烦,需要一个一个的配置;

2.3、还有就是如果你使用springmvc,lazy-init几乎没啥用,因为springmvc容器在启动时会通过 DefaultAnnotationHandlerMapping查找相关的带有@RequestMapping的bean并注册请求映射;所以相关的如 Service/Repository也级联非lazy-init;

因此我写了个工具:SpeedUpSpringProcessor,其作用是:lazy-init所有bean,包括注解的bean;对于【2.3】后续介绍解决方案;具体配置请参考最后。

3、移除调试阶段不相干的bean

有些bean在调试阶段我们并不需要,如我们在测试用户模块时,可能不需要测试权限模块;此时我们可以把不相干的bean移除掉;具体配置请参考最后。

这样的话,可以考虑如把@Controller的bean移除,这样的话如Service/Repository就可以lazy-init了。

常见的可以移除的如:

  • 任务调度器(quartz)、AOP相关等等;
  • 此处需要合理的分包,否则无法应用或应用困难。

4、删除无用属性

如在测试shiro时,可能不需要remember的功能,此时可以把属性移除/禁用(即将值设置为false);具体配置请参考最后。

5、替换正式机数据源为最快的数据源

如此处我把DruidDataSource数据源直接替换为org.springframework.jdbc.datasource.DriverManagerDataSource,这个速度最快;

6、替换jackson为fastjson

此处测试了下jackson速度比fastjson慢许多的。支持国产。

7、项目分模块开发 

如果项目模块比较多,可以考虑放弃注解,而使用xml配置方式+约定。因为实际做项目时可能把配置分到多个配置文件,此时我尝试了下合并到一个,几乎没啥速度提升,所以还是分开存好。

到此spring容器启动速度算是比较快了,不知道大家还有没有好的策略。欢迎指点。

加速Hibernate/JPA

此处以org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean为例。

1、 精确化packagesToScan

和之前的spring一样,写比较精确的实体扫描路径

  1. <property name="packagesToScan" value="com.sishuok.es.**.entity"/> 

2、generateDdl=false 禁用掉

没必要每次都生成ddl

3、 禁用JSR-303验证

默认情况下是AUTO,会根据classpath下是否有jsr-303实现来自动注册;

  1. <!-- 使用自定义的validator进行jsr303验证 --> 
  2. <entry key="javax.persistence.validation.factory" value-ref="validator"/> 
  3. <!-- jsr303验证模式 因为其要么验证 要么不验证 不能按照规则走 所以此处禁用 --> 
  4. <!-- #http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/configuration.html --> 
  5. <entry key="javax.persistence.validation.mode" value="NONE"/> 

此处validator 直接引用我们项目中定义的,而不是让hibernate再去new一个。而且也不推荐在这验证,具体为什么,请参考我的《我是这样认识注解和XML的》。

4、如果你的项目都是注解,此时就没必要扫描hbm了,禁用掉

  1. <entry key="hibernate.archive.autodetection" value="class"/> 

5、如果你不使用NamedQuery,禁用掉

  1. <entry key="hibernate.query.startup_check" value="false"/> 

6、在调试阶段禁用掉二级缓存

通过如上手段,我的spring容器启动速度提升了一半多。大家还有好的优化策略吗?如果有欢迎补充。具体配置请参考最后。

之前提到的SpeedUpSpringProcessor配置

  1. <!-- 优化spring启动 通过移除bean定义 和 lazy init 实现 --> 
  2. <bean class="com.sishuok.es.common.spring.SpeedUpSpringProcessor"> 
  3.     <!-- 需要从bean定义中移除的bean的名字 --> 
  4.     <property name="removedBeanNames"> 
  5.         <list> 
  6.             <!-- spring-config-quartz.xml --> 
  7.             <value>scheduler</value> 
  8.             <value>autoClearDeletedRelationTrigger</value> 
  9.             <value>autoClearExpiredOrDeletedmMessageTrigger</value> 
  10.             <value>autoClearDeletedRelationJob</value> 
  11.             <value>autoClearExpiredOrDeletedmMessageJob</value> 
  12.   
  13.             <!-- spring-config-shiro.xml --> 
  14.             <value>rememberMeCookie</value> 
  15.             <value>rememberMeManager</value> 
  16.             <value>shiroCacheManager</value> 
  17.             <value>sessionValidationScheduler</value> 
  18.             <value>sessionValidationScheduler</value> 
  19.             <!-- spring-mvc.xml --> 
  20.             <value>multipartResolver</value> 
  21.   
  22.             <!-- spring-config-monitor.xml --> 
  23.             <value>druidStatInterceptor</value> 
  24.             <value>druidAdvisor</value> 
  25.         </list> 
  26.     </property> 
  27.     <!-- 需要从bean定义中移除的bean的属性 --> 
  28.     <!--替换掉的属性值 see removedBeanProperties 只支持简单属性--> 
  29.     <property name="removeOrReplaceBeanProperties"> 
  30.         <list> 
  31.             <!-- spring-config-shiro.xml --> 
  32.             <value>sessionManager#cacheManager</value> 
  33.             <value>sessionManager#cacheManager</value> 
  34.             <value>sessionManager#sessionValidationScheduler</value> 
  35.             <value>securityManager#rememberMeManager</value> 
  36.   
  37.             <!-- spring-config.xml --> 
  38.             <value>entityManagerFactory#jpaPropertyMap#hibernate.default_batch_fetch_size"</value> 
  39.             <value>entityManagerFactory#jpaPropertyMap#hibernate.max_fetch_depth"</value> 
  40.             <value>entityManagerFactory#jpaPropertyMap#hibernate.generate_statistics</value> 
  41.             <value>entityManagerFactory#jpaPropertyMap#hibernate.bytecode.use_reflection_optimizer</value> 
  42.             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false</value> 
  43.             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_query_cache</value> 
  44.             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.region.factory_class</value> 
  45.             <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_structured_entries</value> 
  46.             <value>entityManagerFactory#jpaPropertyMap#net.sf.ehcache.configurationResourceName</value> 
  47.         </list> 
  48.     </property> 
  49.   
  50.     <!-- 需要从bean定义中移除指定的类类型 正则表达式--> 
  51.     <property name="removedClassPatterns"> 
  52.         <list> 
  53.              <value>com\.sishuok\.es\.showcase.*</value> 
  54.              <value>com\.sishuok\.es\.monitor.*</value> 
  55.              <value>com\.sishuok\.es\.extra\.aop.*</value> 
  56.              <value>com\.sishuok\.es\.extra\.quartz.*</value> 
  57.              <value>com\.sishuok\.es\.conf.*</value> 
  58.              <!--<value>com\.sishuok\.es\.personal.*\.web\.controller.*</value>--> 
  59.              <!--<value>com\.sishuok\.es\.sys.*\.web\.controller.*</value>--> 
  60.         </list> 
  61.     </property> 
  62.   
  63.     <!-- 指定非延迟加载的bean--> 
  64.     <property name="noneLazyBeanNames"> 
  65.         <list> 
  66.             <value>domainClassConverter</value> 
  67.         </list> 
  68.     </property> 
  69. </bean> 
  1. 默认所有bean lazy-init;
  2. removedClassPatterns:正则表达式,即可以移除的bean的class路径模式,bean class匹配该模式的将移除;此处需要良好的分包,否则不好应用;
  3. removedBeanNames:即在调试期间可以移除的bean;
  4. removeOrReplaceBeanProperties:调试期间可以删除/替换掉的bean属性;如移除shiro的sessionManager的cacheManager;如禁用hibernate二级缓存:entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false
  5. noneLazyBeanNames:有些bean不能lazy-init;排除掉。

具体实现请参考:

可以直接下载使用。

SpeedUpSpringProcessor:

https://github.com/zhangkaitao/es/blob/master/common/src/main/java/com/sishuok/es/common/spring/SpeedUpSpringProcessor.java

spring-speed-up.xml:

https://github.com/zhangkaitao/es/blob/master/web/src/main/resources/spring-speed-up.xml

其他提到的配置文件都在:

https://github.com/zhangkaitao/es/tree/master/web/src/main/resources

开启/关闭:

此处我使用了spring的profile:

  1. <beans profile="development" > 

即只有当System.getProperties中有spring.profiles.active=developement才执行调试模式,所以如果没有该配置还是走的正常流程,对系统没有影响,所以此处大家可以使用:

1、jetty内嵌执行时设置该属性

  1. <plugin> 
  2.     <groupId>org.mortbay.jetty</groupId> 
  3.     <artifactId>jetty-maven-plugin</artifactId> 
  4.     <version>${jetty.version}</version> 
  5.     <configuration> 
  6.         ---省略 
  7.         <!-- spring profile  --> 
  8.         <systemProperties> 
  9.             <systemProperty> 
  10.                 <name>spring.profiles.active</name> 
  11.                 <value>development</value> 
  12.             </systemProperty> 
  13.         </systemProperties> 
  14.     </configuration> 
  15. </plugin> 

 

2、写多个bat文件分别执行不同的情况。

15
6
分享到:
评论
8 楼 guduxing890 2013-11-07  
不厚道。.....
7 楼 inotgaoshou 2013-11-06  
抄袭也能上首页~楼主真没RP,抄袭开涛老师的文章居然不注明~
6 楼 无处不在的风 2013-11-05  
张开涛是我的老师 楼主请速速删除
5 楼 lvwenwen 2013-11-05  
在iteye上转载张开涛的文章?
4 楼 sgq0085 2013-11-05  
在iteye上转载张开涛的文章,还不注明? 楼主还有人品了么?
3 楼 zhoujiangzi 2013-11-05  
好像在哪里看过~蛋不是同一个作者
2 楼 无处不在的风 2013-11-05  
请不要抄袭 请楼主尊重别人的成果 删掉吧
1 楼 ansjsun 2013-11-05  
针对这种问题。最好的办法就是不用spring

相关推荐

    模具状态监测行业发展趋势:预计到2030年市场规模为5.06亿美元

    模具状态监测市场:6.8%的年复合增长率引领制造业智能化升级 在快速发展的制造业中,模具作为生产过程中的核心部件,其状态直接影响到产品的质量和生产效率。然而,模具的损耗和故障往往难以预测,给企业带来不小的损失。如今,随着模具状态监测技术的兴起,这一切正在发生改变。这项创新技术不仅能够帮助企业提前发现模具的潜在问题,还能显著延长模具的使用寿命,提升生产效率。但你真的了解这个市场的潜力和现状吗?让我们一同揭开模具状态监测市场的神秘面纱。 市场概况: 根据QYR(恒州博智)的统计,2023年全球模具状态监测市场的销售额已经达到了3.2亿美元,预计到2030年,这一数字将攀升至5.06亿美元,年复合增长率高达6.8%。这一显著的增长背后,是制造业对智能化、自动化生产需求的不断提升,以及模具状态监测技术在提高生产效率、降低维护成本方面的显著优势。 技术创新与趋势: 模具状态监测技术主要依赖于传感器、数据分析和处理等技术手段,能够实时采集模具的温度、振动、压力等指标,并通过与预设参数的比对,及时识别模具的异常情况。随着物联网、大数据和人工智能等技术的不断发展,模具状态监测技术将更加智能化,能够提供

    Kubernetes DevOps实践工作坊-从理论到实战操作脚本集(含源码).zip

    Kubernetes DevOps实践工作坊-从理论到实战操作脚本集(含源码).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)

    基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设),个人经导师指导并认可通过的毕业设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springb

    欧姆龙NX1P2系列总线plc程序 自动检测机,plc程序,无触摸屏程序 1.多工位DDR马达转盘控制,多工位同时加工 2.多产品配方功能程序 3.各种实用型自制功能块程序,可重复调用,成熟设备

    欧姆龙NX1P2系列总线plc程序 自动检测机,plc程序,无触摸屏程序 1.多工位DDR马达转盘控制,多工位同时加工。 2.多产品配方功能程序。 3.各种实用型自制功能块程序,可重复调用,成熟设备

    企业微信最全养号、防封、加人机制.pdf

    企业微信最全养号、防封、加人机制.pdf

    LLM 友好的异步爬虫框架

    这是一款用 Python 开发的异步爬虫框架,能够将网站上的数据转化成 Markdown、JSON 等 LLM 友好的输出格式。它完全开源且免费,极大地简化了异步爬虫的编写。相比于付费的 Firecrawl,它具有更快的爬取速度,支持同时抓取多个 URL、页面截图、关键字优化提取(基于 LLM)和复杂的多页面会话管理等功能。

    毕设Python春节电影信息爬取与可视化分析源码+项目说明+全部资料.zip

    毕设Python春节电影信息爬取与可视化分析源码+项目说明+全部资料.zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    2019厦门国际银行数创金融杯源码+竞赛策略报告文档.zip

    2019厦门国际银行数创金融杯源码+竞赛策略报告文档.zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)

    基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业),个人经导师指导并认可通过的毕业设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开

    基于java的小区智能卡管理系统设计与实现.docx

    基于java的小区智能卡管理系统设计与实现.docx

    NLP中文垃圾短信分类系统源码+设计全部资料+文档报告(自然语言处理课设).zip

    NLP中文垃圾短信分类系统源码+设计全部资料+文档报告(自然语言处理课设).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    电源滤波器车辆状态估计,扩展卡尔曼滤波EKF,无迹卡尔曼滤波UKF车辆状态估计,扩展卡尔曼滤波EKF,无迹卡尔曼滤波UKF 角阶跃输入+整车7自由度模型+UKF状态估计模型+附送EKF状态估计模型,针

    电源滤波器车辆状态估计,扩展卡尔曼滤波EKF,无迹卡尔曼滤波UKF车辆状态估计,扩展卡尔曼滤波EKF,无迹卡尔曼滤波UKF 角阶跃输入+整车7自由度模型+UKF状态估计模型+附送EKF状态估计模型,针对于轮毂电机分布式驱动车辆,进行车速,质心侧偏角,横摆角速度估计。 模型输入:方向盘转角delta,车辆纵向加速度ax 模型输出:横摆角速度wz,纵向车速vx,质心侧偏角β

Global site tag (gtag.js) - Google Analytics