如何讓 Spring Boot 啟動的更快?
來源:http://rrd.me/ekc64
“spring有多快?”
這是 2018 spring One Platform 中的一場會議。看完會議視頻,我自己動手試了一下。下面是我做出的測試結果。
還沒有觀看視頻的朋友推薦看一下,非常有意思。
https://springoneplatform.io/2018/sessions/how-fast-is-spring-
本文使用的代碼
https://github.com/bufferings/spring-boot-startup-mybench
我使用的是 OpenJDK 11。
可以按照下面這樣運行基準測試。運行起來可能需要一些時間,下面會執行所有的測試。
1. FluxBaseline
我使用 SpringInitializr 創建項目,僅包含 Reactive Web。接下來,我會寫一個 WebMVC 風格的極簡controller。
Spring boot 版本是 2.1.0.RELEASE。
啟動結果 2.938 ± 0.287 s/op。
現在,以這個結果作為基線。讓我們從這里開始。
2. WebMVC
我很好奇為什么要用 WebMVC 而不是 WebFlux?我嘗試了一下。也許僅僅是為了比較 Tomcat 和 Netty?
WebFlux 快了一點,難道不是嗎?
3. spring-context-indexer
接下來,我試了 spring-context-indexer,似乎創建了 component index。
嗯…慢了一點點?
我檢查了 spring.components,發現只包含了一個組件。了解…我應該嘗試更大一點的項目,這樣才能看到效果。
4. 惰性初始化
嘗試了惰性初始化。
查看結果,啟動變快了一點。
5. NoVerify
運行加 -noverify 選項:
啟動變得快了一點。不知道為什么有這個結果,稍后需要仔細了解一下。
6. TieredStopAtLevel
運行加 -XX:TieredStopAtLevel=1 選項:
嗯,快多了!減少了幾乎2秒。還是不知道這個參數有什么含義,稍后需要仔細了解一下。
7. 指定 SpringConfigLocation 參數
運行加 -Dspring.config.location=classpath:/application.properties 選項:
嗯,又變慢了。
8. 關閉 JMX
運行加 -Dspring.jmx.enabled=false 選項:
變得快了一點。
9. 取消 Logback
從這里開始,我開始減少函數庫。開始,取消 Logback:
結果如下:
嗯…似乎有一點點改進?
10. 取消 Jackson
接下來是 Jackson
結果如下:
結果變快了一點。
11. 取消 HibernateValidator
結果如下:
也有一點效果。
到這里為止,不再取消函數庫了。
12. AppCDS
AppCDS (Application Class Data Sharing) 是 Oracle JDK 的一個企業版功能。OpenJDK 10 開始包含了這個功能。
看起來 AppCDS 轉儲信息存到了一個共享壓縮文件,所以啟動時間變短了。
嗯…并沒有變快…然后我閱讀了CDS的相關文章,找到原因了。
SpringBoot FatJAR 不在 CDS 管理范圍內。
13. 使用 Thin Launcher 的 Flux
嗯,對不起,“Exploded” 基準測試錯了。我曾經試著使用 FatJAR,但是 CDS 不能這么干。所以,我轉而使用 Thin Launcher,所以 “Exploded” 就變成了 “Thin Launche”。
使用 CDS 以前,我會測試使用 Thin Launcher 打包 JAR 文件的啟動速度。
盡管我使用 Thin Launcher 打包 app,但并沒有使用 Thin Launcher 啟動類,而是使用 Main class 讓啟動盡可能快一些。
嗯,快了一點,對嗎?
14. Thin Launcher + CDS
現在,我要使用 AppCDS 。
喔!變得更快了!
15. 所有操作都上
最終,我把所有操作都用上。
小于1秒鐘!(∩′?`)∩耶
更進一步
在 Dave 的視頻中,他提到了“函數式 Bean 定義”,嘗試僅使用 Spring 不用 SpringBoot,app變得更快了。其中的道理還需要進一步了解。
結果:
真的很有意思。感謝!
本文轉載自微信公眾號【朱小廝的博客】
Spring Boot Spring
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。