優(yōu)化spring?boot應(yīng)用后6s內(nèi)啟動(dòng)內(nèi)存減半
前言
taptap-developer是一個(gè)spring boot框架驅(qū)動(dòng)的純Grpc服務(wù),所以,只用了四步,移除了web和spring cloud相關(guān)的模塊后,啟動(dòng)速度就穩(wěn)穩(wěn)的保持在了6s內(nèi)。除了啟動(dòng)速度提升外,在服務(wù)待機(jī)狀態(tài)下,內(nèi)存銳減了50%左右,從500M左右的內(nèi)存占用,縮減到了250M不到。
分析日志

日志是一個(gè)應(yīng)用的門面,在未深入了解一個(gè)應(yīng)用的架構(gòu)前,通過(guò)啟動(dòng)的日志輸出基本可以分析出這個(gè)應(yīng)用的大概的技術(shù)構(gòu)成。在分析日志之前,在強(qiáng)調(diào)一點(diǎn),這個(gè)應(yīng)用是一個(gè)純Grpc的服務(wù)。如上圖貼出的日志,是未優(yōu)化前的系統(tǒng)日志輸出,從上到下有四個(gè)紅色箭頭指向,是本次日志分析的關(guān)鍵信息,下面就這四個(gè)關(guān)鍵信息,分別分析下。然后總結(jié)出常見(jiàn)的優(yōu)化方法
優(yōu)化點(diǎn)一:關(guān)于SPRING DATA REPOSITORY SCANNING
Spring Data repository是一個(gè)高度抽象的數(shù)據(jù)訪問(wèn)層接口,常見(jiàn)的實(shí)現(xiàn)有redis、jdbc、jpa、MongoDB、elasticsearch等等。實(shí)現(xiàn)一個(gè)Spring-data-xxx包,需要實(shí)現(xiàn)
org.springframework.data.repository.core.support.RepositoryFactorySupport抽象類
然后在!/META-INF/spring.factories文件中定義好實(shí)現(xiàn)類。spring容器啟動(dòng)時(shí),會(huì)掃描加載factories的信息。如果一個(gè)項(xiàng)目里有被掃描到有多個(gè)spring-data-xxx的實(shí)現(xiàn),啟動(dòng)時(shí)日志就會(huì)打印
Multiple Spring Data modules found, entering strict repository configuration mode!
優(yōu)化:看到這個(gè)日志,我們就需要檢查下項(xiàng)目中是否用到了這些功能,比如引入了spring-data-redis,其實(shí)只用到了其攜帶的jedis,而且jedis實(shí)例可能還是自己實(shí)例化的,這個(gè)時(shí)候就可以禁用repository的功能。參考配置如下:
spring.data.redis.repositories.enabled=false
Spring Data repository有三種內(nèi)置的初始化模式,分別對(duì)應(yīng)如下:
DEFAULT:和Spring其他Bean一樣,在容器上下文加載時(shí)就初始化DEFERRED:惰性加載,容器上下文啟動(dòng)完成后開(kāi)始初始化LAZY:惰性加載,并且延遲注入,容器上下文啟動(dòng)完成接收第一個(gè)請(qǐng)求時(shí)開(kāi)始初始化
如日志輸出:Bootstrapping Spring Data repositories in DEFAULT mode,默認(rèn)是隨容器啟動(dòng)就開(kāi)始初始化的
優(yōu)化:這里可以根據(jù)業(yè)務(wù)特點(diǎn),選擇延遲加載,
參考配置spring.data.jpa.repositories.bootstrap-mode=lazy
Spring Data repository會(huì)掃描項(xiàng)目中的實(shí)現(xiàn)了repository接口的類,默認(rèn)情況下會(huì)盲掃所有的jar包,
日志輸出:Finished Spring Data repository scanning in 148ms. Found 0 repository interfaces.
打印出了掃描repository接口的耗時(shí)情況。
優(yōu)化:
這里可以通過(guò)@EnableRedisRepositories(basePackages = "com.taptap")指定掃描的路徑
可以顯著提升掃描加載的速度
優(yōu)化點(diǎn)二:關(guān)于WEBAPPLICATIONCONTEXT
在spring中,WebApplicationContext是ApplicationContext的增強(qiáng),由spring-web-mvc實(shí)現(xiàn),增加了servlet、session等web相關(guān)的內(nèi)容。
從日志Initializing Spring embedded WebApplicationContext可以看出,我們初始化了一個(gè)web容器,而純Grpc服務(wù)用不到Web的容器上下文,所以移除如下依賴即可
優(yōu)化:
移除implementation('org.springframework.boot:spring-boot-starter-web')
優(yōu)化點(diǎn)三:關(guān)于SERVLET容器
spring-web-mvc是基于java web標(biāo)準(zhǔn)servlet設(shè)計(jì)架構(gòu)的。而servlet是由servlet容器來(lái)驅(qū)動(dòng)的,常見(jiàn)的servlet有tocmat、jetty、undertow等。從日志中可看出,我們啟動(dòng)了一個(gè)8081的servlet容器。這個(gè)不應(yīng)該出現(xiàn)在純Grpc的服務(wù)中,所以,直接移除即可。
優(yōu)化:
移除implementation 'org.springframework.boot:spring-boot-starter-undertow'
優(yōu)化點(diǎn)四:關(guān)于ARCHAIUS配置組件
從最后一個(gè)箭頭指向的日志信息可以分析出,項(xiàng)目引入了archaius配置加載組件,所以項(xiàng)目在啟動(dòng)時(shí),archaius會(huì)嘗試去加載默認(rèn)策略的配置源。而我們整體的技術(shù)棧,配置中心統(tǒng)一采用了apollo,所以可以直接移除,最后通過(guò)分析定位,archaius不是單獨(dú)引入的,是隨著spring-cloud-starter-netflix-hystrix一同引入,這個(gè)組件是spring-cloud-netflix微服務(wù)框架最常用的,但是在這邊,目前所有的微服務(wù)都是直接注冊(cè)到k8s容器的,所有服務(wù)的熔斷、限流、負(fù)載均衡都下沉到了容器基數(shù)設(shè)施平臺(tái),所以應(yīng)用層面雖然引入了這個(gè)包,其實(shí)沒(méi)有實(shí)際作用,所以最后移除spring cloud相關(guān)組件
優(yōu)化:
移除implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'和
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix'組件、
附優(yōu)化后的日志輸出:

系統(tǒng)資源的變化
優(yōu)化前的

優(yōu)化后的

最后,基于資源監(jiān)控圖,從三個(gè)維度總結(jié)下,優(yōu)化后的資源占用情況:
| 資源名稱 | 優(yōu)化前 | 優(yōu)化后 |
|---|---|---|
| 內(nèi)存 | 500M左右 | 250M左右 |
| 總線程數(shù) | 107 | 78 |
| 裝載類 | 12922 | 10041 |
以上就是優(yōu)化spring boot應(yīng)用后6s內(nèi)啟動(dòng)內(nèi)存減半的詳細(xì)內(nèi)容,更多關(guān)于spring boot應(yīng)用優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring整合CXF webservice restful實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了Spring整合CXF webservice restful的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
新版本Spring中l(wèi)ombok失效的問(wèn)題解決
Lombok是一個(gè)Java庫(kù),通過(guò)添加注解簡(jiǎn)化代碼編寫,本文主要介紹了新版本Spring中l(wèi)ombok失效的問(wèn)題解決,感興趣的可以了解一下2025-01-01
SpringBoot中的application.properties無(wú)法加載問(wèn)題定位技巧
這篇文章主要介紹了SpringBoot中的application.properties無(wú)法加載問(wèn)題定位技巧,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Springboot整合Mybatispuls的實(shí)例詳解
這篇文章主要介紹了Springboot整合Mybatispuls的相關(guān)資料,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Spring Web項(xiàng)目spring配置文件隨服務(wù)器啟動(dòng)時(shí)自動(dòng)加載
這篇文章主要介紹了Spring Web項(xiàng)目spring配置文件隨服務(wù)器啟動(dòng)時(shí)自動(dòng)加載,加載spring的配置文件,并且只加載一次,從而提高程序效率。具體內(nèi)容詳情大家通過(guò)本文一起學(xué)習(xí)吧2018-01-01
JFinal 調(diào)用存儲(chǔ)過(guò)程的步驟
這篇文章主要介紹了JFinal 調(diào)用存儲(chǔ)過(guò)程的步驟,幫助大家更好的理解和學(xué)習(xí)使用JFinal,感興趣的朋友可以了解下2021-03-03
Java Json字符串的雙引號(hào)("")括號(hào)如何去掉
這篇文章主要介紹了Java Json字符串的雙引號(hào)("")括號(hào)如何去掉?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
走進(jìn)SpringBoot之配置文件與多環(huán)境詳解
這篇文章主要介紹了走進(jìn)SpringBoot之配置文件與多環(huán)境,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05

