springboot程序啟動(dòng)慢-未配置hostname的解決
springboot程序啟動(dòng)慢-未配置hostname
今天有同時(shí)反饋?zhàn)约旱某绦蛟诒镜豰ac環(huán)境還正常,在生產(chǎn)環(huán)境上centos7啟動(dòng)特別慢
具體日志如下
可以看到程序在這里卡了將近2分鐘時(shí)間,期間無(wú)任何日志輸出。
通過(guò)jstack查看線(xiàn)程發(fā)現(xiàn)如下信息
查看源碼如下
public native InetAddress[] lookupAllHostAddr(String hostname) throws UnknownHostException;
入?yún)閔ostname,于是查看機(jī)器hostname,再ping hostname發(fā)現(xiàn)ping不通,至此知道解決辦法應(yīng)該是在/etc/hosts配置一下hostname為本機(jī)ip即可解決。
配置hostname后程序正常啟動(dòng)了。
Spring Boot啟動(dòng)速度慢的原因總結(jié)
現(xiàn)在spring boot的架構(gòu)可以說(shuō)是非常流行,不會(huì)你都不好意思說(shuō)你是做java的??墒撬饸w火,也有一些小問(wèn)題需要咱們?nèi)プ⒁狻?/p>
如果是單體項(xiàng)目,并且在啟動(dòng)速度方面沒(méi)有任何要求,那么請(qǐng)忽略。
下面進(jìn)入主題,在什么情況下spring boot的項(xiàng)目啟動(dòng)會(huì)變慢呢
前提條件
啟動(dòng)項(xiàng)目的機(jī)器硬件配置不能拖后腿,否則你說(shuō)項(xiàng)目啟動(dòng)慢,項(xiàng)目還覺(jué)得機(jī)器不行呢…
比如網(wǎng)絡(luò),內(nèi)存大小,CPU核心數(shù)等,不要求太高,至少也要夠用吧
拋開(kāi)各種人為因素,例如各種連接時(shí)間較長(zhǎng),其他組件啟動(dòng)較慢導(dǎo)致等待…
原因一
項(xiàng)目中使用的無(wú)用配置太多。
例如在一個(gè)最簡(jiǎn)單的web中,你還加入了其他各種maven配置,并且將他們配置到項(xiàng)目中(只是比較夸張的例子,這些配置加入都不用),然后項(xiàng)目本身也不懂,既然你配置了,那就加載唄。一個(gè)花0.1秒,10個(gè)就1秒,100個(gè)就10秒了…以此類(lèi)推,這一點(diǎn)就是最容易想明白的地方了。
原因二
spring boot的自動(dòng)配置。
自動(dòng)配置是spring boot的一個(gè)特色,但是也是它啟動(dòng)慢的一個(gè)弊病。沒(méi)辦法,通常好用功能全的東西,總會(huì)在一些地方上有缺陷。上面說(shuō)到無(wú)用的配置多,這里要說(shuō)的就是spring boot它自己裝配的東西太多。你可以看到在spring boot的相關(guān)jar包里,都存放著spring.factories的文件,進(jìn)去一看,大部分都是寫(xiě)了很多的類(lèi),它是實(shí)現(xiàn)spring boot自動(dòng)裝配的核心之一。但是你仔細(xì)觀察會(huì)發(fā)現(xiàn),其實(shí)有很多類(lèi),你可能完全不用。但有什么辦法呢,不管你用不用,至少它都會(huì)給你檢查一遍,這不也是花時(shí)間的地方嗎?
原因三
項(xiàng)目精簡(jiǎn)程度不夠。
現(xiàn)在比較流行微服務(wù)的概念,我認(rèn)為它的概念核心含義即為精簡(jiǎn),單一,并且多數(shù)需要強(qiáng)調(diào)啟動(dòng)速度的地方也多是出自微服務(wù)的項(xiàng)目中。一個(gè)微服務(wù)項(xiàng)目中,最好是在10秒以?xún)?nèi)能夠啟動(dòng)完畢。但是多數(shù)是做不到的,原因在于項(xiàng)目拆分的還不夠細(xì)。你說(shuō)一個(gè)接口啟動(dòng)快,還是10個(gè)快,或是更多,答案很明顯。很多項(xiàng)目做到了大而全,所謂大而全就是功能很多,配置很齊全,各種可以擴(kuò)展配置等,全面的不行不行的,但這意味著什么,你的配置多,有用沒(méi)用先不管,至少需要編譯和加載的類(lèi)文件都會(huì)多出很多來(lái),你說(shuō)要這樣的項(xiàng)目能啟動(dòng)快,怎么能啟動(dòng)快呢?
解決方法
- 檢查maven中是否無(wú)用的依賴(lài)太多
- 比較復(fù)雜,使用spring-boot-maven插件debug啟動(dòng),查看該項(xiàng)目中,使用了哪些配置,哪些配置沒(méi)用,然后在啟動(dòng)類(lèi)中直接注明只啟動(dòng)使用了的類(lèi),并且刪掉@SpringBootApplication注解,手動(dòng)填上@Configuration和@Import注解,并在@Import注解中加上那些配置的類(lèi)。
- 更換一些配置更快的依賴(lài)。例如,你使用A數(shù)據(jù)庫(kù)連接池,功能全,配置多,但速度較慢,但是其實(shí)B連接池也能滿(mǎn)足項(xiàng)目需求,但是功能相對(duì)較少,所以配置也少,啟動(dòng)更快,你是不是需要考A和B應(yīng)該選一個(gè)。
- 拆分出更精簡(jiǎn)的項(xiàng)目來(lái)獨(dú)自運(yùn)行,大而全意味著多而不精,精而簡(jiǎn)意味著少但是精通,它們速度,不言而喻。
此次分享就到這里,歡迎大家的討論。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決IDEA Gradle構(gòu)建報(bào)錯(cuò)''Cause: zip END header not found''
這篇文章主要介紹了解決IDEA Gradle構(gòu)建報(bào)錯(cuò)"Cause: zip END header not found"的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Java動(dòng)態(tài)替換properties文件中鍵值方式
這篇文章主要介紹了Java動(dòng)態(tài)替換properties文件中鍵值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Java并發(fā)編程示例(八):處理線(xiàn)程的非受檢異常
這篇文章主要介紹了Java并發(fā)編程示例(八):處理線(xiàn)程的非受檢異常,Java為我們提供了一種機(jī)制,專(zhuān)門(mén)用于處理由Thread對(duì)象拋出的非受檢異常,以避免程序的退出,需要的朋友可以參考下2014-12-12Java8新特性之深入解析日期和時(shí)間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java8新特性之深入解析日期和時(shí)間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-06-06logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀
這篇文章主要為大家介紹了logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11哈希表在算法題目中的實(shí)際應(yīng)用詳解(Java)
散列表(Hash?table,也叫哈希表)是根據(jù)關(guān)鍵碼值(Key?value)而直接進(jìn)行訪(fǎng)問(wèn)的數(shù)據(jù)結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于哈希表在算法題目中的實(shí)際應(yīng)用,文中介紹的方法是Java,需要的朋友可以參考下2024-03-03IDEA 非常重要的一些設(shè)置項(xiàng)(一連串的問(wèn)題差點(diǎn)讓我重新用回 Eclipse)
這篇文章主要介紹了IDEA 非常重要的一些設(shè)置項(xiàng)(一連串的問(wèn)題差點(diǎn)讓我重新用回 Eclipse),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08