好东西做个记载:出自http://tomcat-oracle.iteye.com/category/295523
在调试spring应用时,动辄几十秒,甚至有的应用上分钟的启动速度,会让整个调试速度慢下来了。等待时间让人抓狂。不知道大家是如何加速spring应用调试速度的,在此分享下我的一次加速过程。欢迎补充指正。
环境
配置:
- thinkpad t410
- 内存:4G内存
- CPU:Intel P8700 双核2.53GHZ
- 系统:WIN XP
- 开发工具:Intellij IDEA 12.0.4
- 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:
- <context:component-scan base-package="com.sishuok.es.**.repository,com.sishuok.es.**.service,com.sishuok.es.**.extra">
这样写,比直接写com.sishuok.es速度要快很多,因为这样扫描的class会很少。
还有,如springmvc 扫描:
- <context:component-scan base-package="com.sishuok.es.**.web.controller" use-default-filters="false">
此处只扫描项目的web.controller包,这样扫描的class也很少。
还有如事务的扫描:
- execution(* com.sishuok.es..service..*+.*(..)
还有如使用spring data jpa时也是这样:
- <jpa:repositories
- base-package="com.sishuok.es.**.repository"
这里需要大家有良好的分包,否则无法优化。
2、延迟加载你的bean
常见的方式是在配置文件中在<beans>上加:
- 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一样,写比较精确的实体扫描路径
- <property name="packagesToScan" value="com.sishuok.es.**.entity"/>
2、generateDdl=false 禁用掉
没必要每次都生成ddl
3、 禁用JSR-303验证
默认情况下是AUTO,会根据classpath下是否有jsr-303实现来自动注册;
- <!-- 使用自定义的validator进行jsr303验证 -->
- <entry key="javax.persistence.validation.factory" value-ref="validator"/>
- <!-- jsr303验证模式 因为其要么验证 要么不验证 不能按照规则走 所以此处禁用 -->
- <!-- #http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/configuration.html -->
- <entry key="javax.persistence.validation.mode" value="NONE"/>
此处validator 直接引用我们项目中定义的,而不是让hibernate再去new一个。而且也不推荐在这验证,具体为什么,请参考我的《我是这样认识注解和XML的》。
4、如果你的项目都是注解,此时就没必要扫描hbm了,禁用掉
- <entry key="hibernate.archive.autodetection" value="class"/>
5、如果你不使用NamedQuery,禁用掉
- <entry key="hibernate.query.startup_check" value="false"/>
6、在调试阶段禁用掉二级缓存
通过如上手段,我的spring容器启动速度提升了一半多。大家还有好的优化策略吗?如果有欢迎补充。具体配置请参考最后。
之前提到的SpeedUpSpringProcessor配置
- <!-- 优化spring启动 通过移除bean定义 和 lazy init 实现 -->
- <bean class="com.sishuok.es.common.spring.SpeedUpSpringProcessor">
- <!-- 需要从bean定义中移除的bean的名字 -->
- <property name="removedBeanNames">
- <list>
- <!-- spring-config-quartz.xml -->
- <value>scheduler</value>
- <value>autoClearDeletedRelationTrigger</value>
- <value>autoClearExpiredOrDeletedmMessageTrigger</value>
- <value>autoClearDeletedRelationJob</value>
- <value>autoClearExpiredOrDeletedmMessageJob</value>
- <!-- spring-config-shiro.xml -->
- <value>rememberMeCookie</value>
- <value>rememberMeManager</value>
- <value>shiroCacheManager</value>
- <value>sessionValidationScheduler</value>
- <value>sessionValidationScheduler</value>
- <!-- spring-mvc.xml -->
- <value>multipartResolver</value>
- <!-- spring-config-monitor.xml -->
- <value>druidStatInterceptor</value>
- <value>druidAdvisor</value>
- </list>
- </property>
- <!-- 需要从bean定义中移除的bean的属性 -->
- <!--替换掉的属性值 see removedBeanProperties 只支持简单属性-->
- <property name="removeOrReplaceBeanProperties">
- <list>
- <!-- spring-config-shiro.xml -->
- <value>sessionManager#cacheManager</value>
- <value>sessionManager#cacheManager</value>
- <value>sessionManager#sessionValidationScheduler</value>
- <value>securityManager#rememberMeManager</value>
- <!-- spring-config.xml -->
- <value>entityManagerFactory#jpaPropertyMap#hibernate.default_batch_fetch_size"</value>
- <value>entityManagerFactory#jpaPropertyMap#hibernate.max_fetch_depth"</value>
- <value>entityManagerFactory#jpaPropertyMap#hibernate.generate_statistics</value>
- <value>entityManagerFactory#jpaPropertyMap#hibernate.bytecode.use_reflection_optimizer</value>
- <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false</value>
- <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_query_cache</value>
- <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.region.factory_class</value>
- <value>entityManagerFactory#jpaPropertyMap#hibernate.cache.use_structured_entries</value>
- <value>entityManagerFactory#jpaPropertyMap#net.sf.ehcache.configurationResourceName</value>
- </list>
- </property>
- <!-- 需要从bean定义中移除指定的类类型 正则表达式-->
- <property name="removedClassPatterns">
- <list>
- <value>com\.sishuok\.es\.showcase.*</value>
- <value>com\.sishuok\.es\.monitor.*</value>
- <value>com\.sishuok\.es\.extra\.aop.*</value>
- <value>com\.sishuok\.es\.extra\.quartz.*</value>
- <value>com\.sishuok\.es\.conf.*</value>
- <!--<value>com\.sishuok\.es\.personal.*\.web\.controller.*</value>-->
- <!--<value>com\.sishuok\.es\.sys.*\.web\.controller.*</value>-->
- </list>
- </property>
- <!-- 指定非延迟加载的bean-->
- <property name="noneLazyBeanNames">
- <list>
- <value>domainClassConverter</value>
- </list>
- </property>
- </bean>
- 默认所有bean lazy-init;
- removedClassPatterns:正则表达式,即可以移除的bean的class路径模式,bean class匹配该模式的将移除;此处需要良好的分包,否则不好应用;
- removedBeanNames:即在调试期间可以移除的bean;
- removeOrReplaceBeanProperties:调试期间可以删除/替换掉的bean属性;如移除shiro的sessionManager的cacheManager;如禁用hibernate二级缓存:entityManagerFactory#jpaPropertyMap#hibernate.cache.use_second_level_cache=false
- 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:
- <beans profile="development" >
即只有当System.getProperties中有spring.profiles.active=developement才执行调试模式,所以如果没有该配置还是走的正常流程,对系统没有影响,所以此处大家可以使用:
1、jetty内嵌执行时设置该属性
- <plugin>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jetty-maven-plugin</artifactId>
- <version>${jetty.version}</version>
- <configuration>
- ---省略
- <!-- spring profile -->
- <systemProperties>
- <systemProperty>
- <name>spring.profiles.active</name>
- <value>development</value>
- </systemProperty>
- </systemProperties>
- </configuration>
- </plugin>
2、写多个bat文件分别执行不同的情况。
相关推荐
Java Spring Startup Analyzer是一款强大的工具,专门用于分析Spring应用程序的启动过程,帮助开发者深入理解应用程序启动时间的消耗,找出性能瓶颈,从而优化应用的启动速度。这个工具为开发者提供了一个交互式的...
性能优化方面,Spring Boot 3.0可能会进一步改善其自动配置机制,提高应用启动速度和运行效率。对于微服务架构的支持也会得到增强,这对于构建大型分布式系统来说至关重要。同时,安全性一直是Spring Boot关注的重点...
4. **Spring Boot支持**:集成对Spring Boot的全面支持,包括启动器管理、应用运行、Actuator监控等,方便开发和调试Spring Boot应用。 5. **Spring Boot DevTools**:通过集成Spring Boot DevTools,开发者可以...
本压缩包"远程调试启动脚本.zip"包含了四个关键脚本,分别为`stop-provider-server.sh`、`stop-web-server.sh`、`start-web-server.sh`和`start-provider-server.sh`,它们分别用于停止和启动服务,这对于设置和调整...
为了能够监控和调试批处理作业,Spring Batch提供了丰富的日志记录和监控工具。通过这些工具,开发者可以查看作业的执行情况,包括每一步的执行状态、作业的性能指标以及任何可能出现的异常。此外,Spring Batch也...
根据项目的需求,可以选择引入特定的jar包,而不是全部引入spring.jar,这样可以避免不必要的类加载,提升应用启动速度。此外,通过深入研究源代码,开发者能够更好地理解和定制Spring的功能,从而提升软件开发的...
这些工具能够帮助开发者更高效地创建、管理和调试Spring应用程序。 2. **Spring Boot**:Spring Boot简化了Spring应用程序的初始设置和配置,通过内置的依赖和默认配置,使得开发者可以快速启动项目。在STS 3.9.5中...
在STS中,开发人员可以享受到智能代码提示和自动完成功能,这些功能基于Spring的元数据,能够帮助快速编写正确的Spring配置和Java代码,减少错误并提高开发速度。 6. **调试与测试工具**: STS集成了强大的调试和...
在这里,我们还需要注意到,使用Idea启动Spring Boot项目时,需要注意到调试模式和正常模式的区别。在调试模式下,Idea可能会使用断点和其他调试工具,这可能会导致启动时间增加。在正常模式下,Idea则不会使用断点...
最后,Spring 3.1 进行了性能优化,降低了内存占用,提高了启动速度,并且提供了更完善的监控和诊断工具,便于开发者调试和优化应用程序。 综上所述,Spring 3.1 jar包包含了Spring框架在多个层面的改进和新特性,...
在调试阶段,Spring IDE还会提供强大的断点和日志功能。 总之,Spring IDE是Spring开发者的得力助手,通过Eclipse的在线安装功能,我们可以轻松地将这个强大的工具集集成到我们的开发环境中。记得保持Eclipse和...
"VsCode搭建Spring Boot项目并进行创建...同时,本资源还介绍了相关的知识点,如VsCode安装扩展、配置Maven、VsCode中使用Maven、VsCode中使用Spring Boot、VsCode中进行调试、使用阿里云的镜像加速Maven更新包速度等。
在性能优化上,STS 4.10.0.RELEASE进行了多项改进,包括更快的启动速度、更好的内存管理以及更流畅的UI响应。这些改进旨在减少开发过程中的等待时间,提高工作效率。 总的来说,SpringToolSuite4 4.10.0.RELEASE是...
4. **完成安装**:等待安装过程完成,完成后可以选择是否立即启动MyEclipse for Spring 9.0。 ### 使用指南 1. **创建Spring项目**:在新建项目时选择Spring相关的模板,快速搭建项目结构。 2. **配置Spring环境**...
SpringLoaded的出现极大地提升了开发效率,它可以在不重启服务器的情况下,实时自动重新加载代码变更,让开发者可以即改即见,显著提高了迭代速度。 SpringLoaded的核心技术在于动态类加载,它能够监控应用运行时的...
4. **开发与调试**:当你在IDE中修改源代码并保存后,SpringLoaded会自动检测这些变化,并对相应的类进行重新加载,而无需手动重启应用。 尽管SpringLoaded提供了便利的热部署功能,但需要注意的是,由于其依赖于...
2. **Spring Framework 5集成**:与Spring Framework 5的紧密集成,带来了更好的反应式编程支持,提升了应用的响应速度和并发处理能力。 3. **改进的Actuator**:Actuator在新版本中进行了大量优化,提供了更丰富的...
1. **模块化设计**:Spring Framework 4.0.0.RELEASE采用了更加模块化的结构,允许开发者根据项目需求选择必要的组件,降低了应用的体积,提高了启动速度。主要模块包括Core Container(核心容器)、Data Access/...
1. 优化性能:Spring 5.2.7.RELEASE在性能上进行了显著优化,包括更快的启动速度和更高效的内存使用。 2. 支持Java 14:此版本开始支持最新的Java版本,提供了对Java 14特性的兼容性。 3. WebSocket改进:增强了...
8. **Spring Cloud工具**:对于开发微服务架构的项目,STS提供了对Spring Cloud的集成,方便管理和调试分布式系统。 9. **插件扩展**:作为Eclipse的变体,STS支持众多Eclipse插件,使得开发者可以根据需求添加更多...