讓我們讓SpringBoot應用程式更快啟動
採取下列措施可能會提高SpringBoot啟動時間:
1. FluxBaseline
使用SpringInitializr建立了一個只有Reactive Web的專案。然後,我寫了一個WebMVC風格的小控制器。
@SpringBootApplication @RestController <b>public</b> <b>class</b> DemoApplication { @GetMapping(<font>"/"</font><font>) <b>public</b> String home() { <b>return</b> </font><font>"Hello"</font><font>; } <b>public</b> <b>static</b> <b>void</b> main(String[] args) { SpringApplication.run(DemoApplication.<b>class</b>, args); } } </font>
Spring Boot的版本是2.1.0.RELEASE。
啟動時需要2.938±0.287 s / op。
現在我有一個基線來檢查啟動時間。讓我們從這裡開始。
2. 使用WebFlux,
提高了速度:MyBenchmark.case02_Web :3.281 ± 0.342
3. spring-context-indexer
它似乎建立了元件索引。對大專案有很多元件時有效果
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-indexer</artifactId> <optional><b>true</b></optional> </dependency>
4. 懶初始化
@Configuration <b>public</b> <b>class</b> LazyInitBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override <b>public</b> <b>void</b> postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { <b>for</b> (String beanName : beanFactory.getBeanDefinitionNames()) { beanFactory.getBeanDefinition(beanName).setLazyInit(<b>true</b>); } } }
5. 無驗證
加入-noverify:
6. TieredStopAtLevel
加入-XX:TieredStopAtLevel=1
效果很好
7.顯式指定SpringConfigLocation
加入-Dspring.config.location=classpath:/application.properties
效果不理想
8.關閉JMX
-Dspring.jmx.enabled=false
9.排除Logback
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <exclusions> <exclusion> <artifactId>spring-boot-starter-logging</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> </dependency>
10. 排除 Jackson
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <exclusions> <exclusion> <artifactId>spring-boot-starter-json</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency>
11.排除HibernateValidator
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <exclusions> <exclusion> <artifactId>hibernate-validator</artifactId> <groupId>org.hibernate.validator</groupId> </exclusion> </exclusions> </dependency>
12. AppCDS
AppCDS(應用程式類資料共享)作為商業功能包含在Oracle JDK中。但它可以從OpenJDK 10獲得。
似乎AppCDS將資訊轉儲到共享存檔中,因此啟動時間變短。使用SpringBoot FatJAR,這些庫不在CDS的範圍內。
13. Flux的thin廋啟動器
<plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot.experimental</groupId> <artifactId>spring-boot-thin-layout</artifactId> <version>1.0.15.RELEASE</version> </dependency> </dependencies> </plugin> </plugins>
雖然我使用Thin Launcher打包應用程式,但我沒有使用Thin Launcher的啟動類,但指定了Main類以儘可能快地啟動啟動時間。
14. Thin Launcher + CDS
最後全部應用上述措施,啟動不到1秒。