Make Spring Boot Starting Time Faster
When working in a cloud environment, startup time is something that is important especially when you application is relying in HPA (Horizontal Pod Autoscale). This means that an application that can start faster is better since they can handle traffic sooner compared when having a slower startup time.
Lets take my sample Spring Boot and Camel project,
https://github.com/edwin/spring-boot-camel-json-and-wsdl
in a normal condition, this application can take almost 10second to starting-up
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.2.5) 2024-06-22T20:24:06.196+07:00 INFO 12328 --- [ main] com.edw.Main : Starting Main using Java 17.0.6 with PID 12328 (spring-boot-camel-json-and-wsdl-1.0.jar started by edwin in /tmp/spring-boot-camel-json-and-wsdl) 2024-06-22T20:24:06.198+07:00 INFO 12328 --- [ main] com.edw.Main : No active profile set, falling back to 1 default profile: "default" ....... 2024-06-22T20:24:14.718+07:00 INFO 12328 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Apache Camel 4.4.0.redhat-00019 (camel-testing) started in 1s623ms (build:0ms init:0ms start:1s623ms) 2024-06-22T20:24:14.726+07:00 INFO 12328 --- [ main] com.edw.Main : Started Main in 9.116 seconds (process running for 9.692)
We can see from above logs that it needs 9second to starting. But some might not see this as ideal, and start looking for some areas of improvements. And we can start by creating our Spring Boot as Lazy-Loading using below application.properties configuration
spring.main.lazy-initialization=true
Adding below Java Variables also help to increase the speed of starting up
-XX:TieredStopAtLevel=1 -noverify
Which finally gives us this Java command
$ java -jar -XX:TieredStopAtLevel=1 -noverify .\target\spring-boot-camel-json-and-wsdl-1.0.jar
and we can see from below logs, starting time is literally reduced into 5seconds, which is good enough.
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.2.5) 2024-06-22T20:31:54.155+07:00 INFO 2512 --- [ main] com.edw.Main : Starting Main using Java 17.0.6 with PID 12328 (spring-boot-camel-json-and-wsdl-1.0.jar started by edwin in /tmp/spring-boot-camel-json-and-wsdl) 2024-06-22T20:31:54.182+07:00 INFO 2512 --- [ main] com.edw.Main : No active profile set, falling back to 1 default profile: "default" ........ 2024-06-22T20:31:59.231+07:00 INFO 2512 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Apache Camel 4.4.0.redhat-00019 (camel-testing) started in 931ms (build:0ms init:0ms start:931ms) 2024-06-22T20:31:59.359+07:00 INFO 2512 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator' 2024-06-22T20:31:59.375+07:00 INFO 2512 --- [ main] com.edw.Main : Started Main in 5.759 seconds (process running for 6.201)