這篇文章主要介紹“如何讓SpringBoot啟動(dòng)更快一點(diǎn)”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“如何讓SpringBoot啟動(dòng)更快一點(diǎn)”文章能幫助大家解決問(wèn)題。
創(chuàng)新互聯(lián)專注于企業(yè)營(yíng)銷(xiāo)型網(wǎng)站、網(wǎng)站重做改版、石峰網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為石峰等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
我使用的是 OpenJDK 11。
? java --version
openjdk 11.0.1 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
可以按照下面這樣運(yùn)行基準(zhǔn)測(cè)試。運(yùn)行起來(lái)可能需要一些時(shí)間,下面會(huì)執(zhí)行所有的測(cè)試。
? ./mvnw clean package
? (cd benchmarks/; java -jar target/benchmarks.jar)
1. FluxBaseline
我使用 SpringInitializr 創(chuàng)建項(xiàng)目,僅包含 Reactive Web。接下來(lái),我會(huì)寫(xiě)一個(gè) WebMVC 風(fēng)格的極簡(jiǎn)controller。
@SpringBootApplication
@RestController
public class DemoApplication {
@GetMapping("/")
public String home() {
return "Hello";
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
↓Spring Boot 版本是 2.1.0.RELEASE。
↓啟動(dòng)結(jié)果 2.938 ± 0.287 s/op。
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
現(xiàn)在,以這個(gè)結(jié)果作為基線。讓我們從這里開(kāi)始。
2. WebMVC
↓我很好奇為什么要用 WebMVC 而不是 WebFlux? 我嘗試了一下。也許僅僅是為了比較 Tomcat 和 Netty?
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case02_Web ss 10 3.281 ± 0.342 s/op
WebFlux 快了一點(diǎn),難道不是嗎?
3. spring-context-indexer
接下來(lái),我試了 spring-context-indexer,似乎創(chuàng)建了 component index。
↓嗯…慢了一點(diǎn)點(diǎn)?
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case03_WithContextIndexer ss 10 3.063 ± 0.102 s/op
↓我檢查了 spring.components,發(fā)現(xiàn)只包含了一個(gè)組件。了解...我應(yīng)該嘗試更大一點(diǎn)的項(xiàng)目,這樣才能看到效果。
#
#Sun Nov 04 18:42:59 JST 2018
com.example.DemoApplication=org.springframework.stereotype.Component
4. 惰性初始化
嘗試了惰性初始化。
@Configuration
public class LazyInitBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
for (String beanName : beanFactory.getBeanDefinitionNames()) {
beanFactory.getBeanDefinition(beanName).setLazyInit(true);
}
}
}
↓查看結(jié)果,啟動(dòng)變快了一點(diǎn)。
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case04_WithLazyInit ss 10 2.844 ± 0.129 s/op
5. NoVerify
運(yùn)行加 -noverify 選項(xiàng):
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case05_WithNoVerifyOption ss 10 2.582 ± 0.060 s/op
啟動(dòng)變得快了一點(diǎn)。不知道為什么有這個(gè)結(jié)果,稍后需要仔細(xì)了解一下。
6. TieredStopAtLevel
運(yùn)行加 -XX:TieredStopAtLevel=1 選項(xiàng):
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case06_WithTieredStopAtLevel1Option ss 10 1.980 ± 0.037 s/op
嗯,快多了!減少了幾乎2秒。還是不知道這個(gè)參數(shù)有什么含義,稍后需要仔細(xì)了解一下。
7. 指定 SpringConfigLocation 參數(shù)
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case07_WithSpringConfigLocationOption ss 10 3.026 ± 0.139 s/op
嗯,又變慢了。
8. 關(guān)閉 JMX
運(yùn)行加 -Dspring.jmx.enabled=false 選項(xiàng):
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case08_WithJmxDisabledOption ss 10 2.877 ± 0.097 s/op
變得快了一點(diǎn)。
9. 取消 Logback
從這里開(kāi)始,我開(kāi)始減少函數(shù)庫(kù)。開(kāi)始,取消 Logback:
結(jié)果如下Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case09_WithoutLogback ss 10 2.904 ± 0.096 s/op
嗯…似乎有一點(diǎn)點(diǎn)改進(jìn)?
10. 取消 Jackson
接下來(lái)是 Jackson
結(jié)果如下:
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case10_WithoutJackson ss 10 2.789 ± 0.093 s/op
結(jié)果變快了一點(diǎn)。
11. 取消 HibernateValidator
結(jié)果如下:
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case11_WithoutHibernateValidator ss 10 2.857 ± 0.084 s/op
也有一點(diǎn)效果。
到這里為止,不再取消函數(shù)庫(kù)了。
12. AppCDS
AppCDS (Application Class Data Sharing) 是 Oracle JDK 的一個(gè)企業(yè)版功能。OpenJDK 10 開(kāi)始包含了這個(gè)功能。
看起來(lái) AppCDS 轉(zhuǎn)儲(chǔ)信息存到了一個(gè)共享壓縮文件,所以啟動(dòng)時(shí)間變短了。
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case12_WithAppCds ss 10 2.957 ± 0.079 s/op
嗯…并沒(méi)有變快…然后我閱讀了CDS的相關(guān)文章,找到原因了。
SpringBoot FatJAR 不在 CDS 管理范圍內(nèi)。
13. 使用 Thin Launcher 的 Flux
嗯,對(duì)不起,“Exploded” 基準(zhǔn)測(cè)試錯(cuò)了。我曾經(jīng)試著使用 FatJAR,但是 CDS 不能這么干。所以,我轉(zhuǎn)而使用 Thin Launcher,所以 “Exploded” 就變成了 “Thin Launche”。
使用 CDS 以前,我會(huì)測(cè)試使用 Thin Launcher 打包 JAR 文件的啟動(dòng)速度。
盡管我使用 Thin Launcher 打包 app,但并沒(méi)有使用 Thin Launcher 啟動(dòng)類,而是使用 Main class 讓啟動(dòng)盡可能快一些。
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case13_Exploded ss 10 2.476 ± 0.091 s/op
嗯,快了一點(diǎn),對(duì)嗎?
14. Thin Launcher + CDS
現(xiàn)在,我要使用 AppCDS 。
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case14_ExplodedWithAppCds ss 10 1.535 ± 0.036 s/op
喔!變得更快了!
15. 所有操作都上
最終,我把所有操作都用上。
1
2
3Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case15_AllApplied ss 10 0.801 ± 0.037 s/op
小于1秒鐘!(∩´∀——)∩耶
更進(jìn)一步
在 Dave 的視頻中,他提到了“函數(shù)式 Bean 定義”,嘗試僅使用 Spring 不用 SpringBoot,app變得更快了。其中的道理還需要進(jìn)一步了解。
結(jié)果:
Benchmark Mode Cnt Score Error Units
MyBenchmark.case01_FluxBaseline ss 10 2.938 ± 0.287 s/op
MyBenchmark.case02_Web ss 10 3.281 ± 0.342 s/op
MyBenchmark.case03_WithContextIndexer ss 10 3.063 ± 0.102 s/op
MyBenchmark.case04_WithLazyInit ss 10 2.844 ± 0.129 s/op
MyBenchmark.case05_WithNoVerifyOption ss 10 2.582 ± 0.060 s/op
MyBenchmark.case06_WithTieredStopAtLevel1Option ss 10 1.980 ± 0.037 s/op
MyBenchmark.case07_WithSpringConfigLocationOption ss 10 3.026 ± 0.139 s/op
MyBenchmark.case08_WithJmxDisabledOption ss 10 2.877 ± 0.097 s/op
MyBenchmark.case09_WithoutLogback ss 10 2.904 ± 0.096 s/op
MyBenchmark.case10_WithoutJackson ss 10 2.789 ± 0.093 s/op
MyBenchmark.case11_WithoutHibernateValidator ss 10 2.857 ± 0.084 s/op
MyBenchmark.case12_WithAppCds ss 10 2.957 ± 0.079 s/op
MyBenchmark.case13_Exploded ss 10 2.476 ± 0.091 s/op
MyBenchmark.case14_ExplodedWithAppCds ss 10 1.535 ± 0.036 s/op
MyBenchmark.case15_AllApplied ss 10 0.801 ± 0.037 s/op
關(guān)于“如何讓SpringBoot啟動(dòng)更快一點(diǎn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。