天天看點

【SpringBoot】SpringBoot性能優化

spring 架構給企業軟體開發者提供了常見問題的通用解決方案,包括那些在未來開發中沒有意識到的問題。但是,它建構的 j2ee 項目變得越來越臃腫,逐漸被 spring boot 所替代。spring boot 讓我們建立和運作項目變得更為迅速,現在已經有越來越多的人使用它。我們已經在幾個項目中使用了 spring boot ,今天我們就來一起讨論一下如何改進 spring boot 應用的性能。

首先,從之前我在開發中遇到的一個問題說起。在一次檢視項目運作日志的時候,我偶然發現了一個問題,日志裡顯示這個項目總是加載 velocity 模闆引擎,但實際上這個項目是一個沒有 web 頁面的 rest service 項目。于是我花了一點時間去尋找産生這個問題的原因,以及如何改進 spring boot 應用的性能。在查找了相關的資料後,我得出的結論如下:

預設情況下,我們會使用 @springbootapplication 注解來自動擷取的應用的配置資訊,但這樣也會給應用帶來一些副作用。使用這個注解後,會觸發自動配置( auto-configuration )和 元件掃描 ( component scanning ),這跟使用 @configuration、@enableautoconfiguration 和 @componentscan 三個注解的作用是一樣的。這樣做給開發帶來友善的同時,也會有兩方面的影響:

1、會導緻項目啟動時間變長。當啟動一個大的應用程式,或将做大量的內建測試啟動應用程式時,影響會特别明顯。

2、會加載一些不需要的多餘的執行個體(beans)。

3、會增加 cpu 消耗。

針對以上兩個情況,我們可以移除 @springbootapplication 和 @componentscan 兩個注解來禁用元件自動掃描,然後在我們需要的 bean 上進行顯式配置:

我們在上面提到,@springbootapplication 注解的作用跟 @enableautoconfiguration 注解的作用是相當的,那就意味着它也能帶來上述的三個問題。要避免這些問題,我們就要知道我們需要的元件清單是哪些,可以用 -ddebug 的方式來幫助我們明确地定位:

接着拷貝 <code>positive matches</code> 中列出的資訊:

然後來更新項目配置,顯式地引入這些元件,引入之後,再運作一下應用確定沒有錯誤發生:

在上面的代碼中,我們可以删掉我們不需要的元件資訊,來提高應用的性能,比如在我的項目中,不需要 jmx 和 websocket 功能,我就删掉了它們。删掉之後,再次運作項目,確定一切正常。

預設情況下,spring boot 使用 tomcat 來作為内嵌的 servlet 容器。我們可以啟動項目,然後用 visualvm 或者 jconsole 來檢視應用所占的記憶體情況:

【SpringBoot】SpringBoot性能優化

以上是我使用 spring boot 的預設方式啟動應用後,用 visualvm 監控到的記憶體的占用情況:堆記憶體占用 110m,16 個線程被開啟。

可以将 web 伺服器切換到 undertow 來提高應用性能。undertow 是一個采用 java 開發的靈活的高性能 web 伺服器,提供包括阻塞和基于 nio 的非堵塞機制。undertow 是紅帽公司的開源産品,是 wildfly 預設的 web 伺服器。首先,從依賴資訊裡移除 tomcat 配置:

然後添加 undertow:

啟動項目後,用 visualvm 監控到的資訊顯示:堆記憶體占用 90m,13個線程被開啟。

【SpringBoot】SpringBoot性能優化

這些都是我們在項目開發中使用到的一些優化 spring

boot 應用的小技巧,對于大的應用性能的提高還是很明顯的。大家可以嘗試一下,然後告訴我們你的測試結果。

最後,附上代碼,大家可以去這裡下載下傳:spring-boot-performance。

文中大部分内容參考英國一個架構師的部落格 和 dzone 近期釋出的文章,在此感謝兩位大牛。參考文章及連結:

(1)spring boot 性能優化:spring boot performance;

(2)spring boot 記憶體優化:spring boot memory performance。

(3)https://www.techempower.com/benchmarks/;

(4)spring 應用程式優化:optimizing spring framework for app engine applications。

繼續閱讀