Minimise Spring Boot Startup Time
Solution 1
I can tell you that I run a large (800,000+ lines of code) application, using restful webservices via Spring MVC, JMS, Atomikos transaction, Hibernate, JMX support, and embedded Tomcat. With all that, the application will start on my local desktop in about 19 seconds.
Spring Boot tries hard not to configure modules you are not using. However, it is easy to introduce additional dependencies and configuration that you did not intend.
Remember that Spring Boot follows the convention over configuration paradigm and by simply placing a library in your class path can cause Spring Boot to attempt to configure a module to use the library. Also, by doing something as simple as annotating your class with @RestController will trigger Spring Boot to auto-configure the entire Spring MVC stack.
You can see what is going on under the covers and enable debug logging as simple as specifying --debug
when starting the application from the command-line. You can also specify debug=true in your application.properties.
In addition, you can set the logging level in application.properties
as simple as:
logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR
If you detect an auto-configured module you don't want, it can be disabled. The docs for this can be found here: http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-disabling-specific-auto-configuration
An example would look like:
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
Solution 2
A few additional tips which may be helpful.
- Use OpenJ9 instead of Hotspot for development
- If you use Hibernate, set
hibernate.ddl-auto=none
instead ofupdate
- Set vmargs to
-Xquickstart
- If you use OpenJ9 - set vmargs to
-XX:TieredStopAtLevel=1 -noverify
- If you use Hotspot - use IDE build instead of Gradle build
- Use Undertow instead of Tomcat
- Don't abuse annotation processing tools (mapstruct, immutables...) which will slow down the build process
In addition:
As this article recommends use @ComponentScan(lazyInit = true)
for local dev environment.
TL;DR
What we want to achieve is to enable the bean lazy loading only in your local development environment and leave eager initialization for production. They say you can’t have your cake and eat it too, but with Spring you actually can. All thanks to profiles.
@SpringBootApplication public class LazyApplication { public static void main(String[] args) { SpringApplication.run(LazyApplication.class, args); } @Configuration @Profile("local") @ComponentScan(lazyInit = true) static class LocalConfig { } }
Comments
-
Samantha Catania over 4 years
In my opinion SpringBoot projects take a long time to load. This probably happens because SpringBoot is configuring components for you, some of which you might not even need. The most obvious thing to do is to remove unnecessary dependancies from your class path. However, that is not enough.
Is there any way to find out which modules SpringBoot is configuring for you to pick out what you don't need and disable them?
Is there anything else one can do to speed up startup time for SpringBoot applications in general?
-
WirJun over 4 years
-noverify
is deprecated in JDK 13 and will likely be removed in a future release -
Ed_ about 2 yearsas of 2022 still slow (compared to .NET, python) even a hello world program is a throwback to the 90s