阿里终面:为什么应用刚启动的时候比较卡,过一会就好了?
△Hollis, 一個對Coding有著獨特追求的人△
這是Hollis的第?391?篇原創(chuàng)分享
作者 l Hollis
來源 l Hollis(ID:hollischuang)
不知道大家有沒有遇到過類似的問題,應(yīng)用在剛剛啟動之后,前幾次訪問都會比較卡頓,RT都會比極高,在運行一段時間之后,就會順暢很多了。
這背后的原因是什么呢?
今天給大家介紹一種可能的原因,也是一種經(jīng)常被別人忽略的原因,也是我們線上環(huán)境遇到過很多次的問題,那就是和JIT有關(guān)的。
JIT編譯
我們知道,想要把高級語言轉(zhuǎn)變成計算機認識的機器語言有兩種方式,分別是編譯和解釋,雖然Java轉(zhuǎn)成機器語言的過程中有一個步驟是要編譯成字節(jié)碼,但是,這里的字節(jié)碼并不能在機器上直接執(zhí)行。
所以,JVM中內(nèi)置了解釋器(interpreter),在運行時對字節(jié)碼進行解釋翻譯成機器碼,然后再執(zhí)行。
解釋器的執(zhí)行方式是一邊翻譯,一邊執(zhí)行,因此執(zhí)行效率很低。為了解決這樣的低效問題,HotSpot引入了JIT技術(shù)(Just-In-Time)。
有了JIT技術(shù)之后,JVM還是通過解釋器進行解釋執(zhí)行。但是,當JVM發(fā)現(xiàn)某個方法或代碼塊運行時執(zhí)行的特別頻繁的時候,就會認為這是“熱點代碼”(Hot Spot Code)。然后JIT會把部分“熱點代碼”翻譯成本地機器相關(guān)的機器碼,并進行優(yōu)化,然后再把翻譯后的機器碼緩存起來,以備下次使用。
這也是HotSpot虛擬機的名字的由來
那么,這和我們今天要講的問題有啥關(guān)系呢?
大家理解了JIT編譯的原理之后,其實可以知道,JIT優(yōu)化是在運行期進行的,并且也不是Java進程剛一啟動就能優(yōu)化的,是需要先執(zhí)行一段時間的,因為他需要先知道哪些是熱點代碼。
所以,在JIT優(yōu)化開始之前,我們的所有請求,都是要經(jīng)過解釋執(zhí)行的,這個過程就會相對慢一些。
而且,如果你們的應(yīng)用的請求量比較大的的話,這種問題就會更加明顯,在應(yīng)用啟動過程中,會有大量的請求過來,這就會導致解釋器持續(xù)的在努力工作。
一旦解釋器對CPU資源占用比較大的話,就會間接的導致CPU、LOAD等飆高,導致應(yīng)用的性能進一步下降。
這也是為什么很多應(yīng)用在發(fā)布過程中,會出現(xiàn)剛剛重啟好的應(yīng)用會發(fā)生大量的超時問題了。
而隨著請求的不斷增多,JIT優(yōu)化就會被觸發(fā),這就是使得后續(xù)的熱點請求的執(zhí)行可能就不需要在通過解釋執(zhí)行了,直接運行JIT優(yōu)化后緩存的機器碼就行了。
如何解決
那么,怎么解決這樣的問題呢?
主要有兩種思路:
1、提升JIT優(yōu)化的效率
2、降低瞬時請求量
在提升JIT優(yōu)化效率的設(shè)計上,大家可以了解一下阿里研發(fā)的JDK——Dragonwell。
這個相比OpenJDK提供了一些專有特性,其中一項叫做JwarmUp的技術(shù)就是解決JIT優(yōu)化效率的問題的。
這個技術(shù)主要是通過記錄Java應(yīng)用上一次運行時候的編譯信息到文件中,在下次應(yīng)用啟動時,讀取該文件,從而在流量進來之前,提前完成類的加載、初始化和方法編譯,從而跳過解釋階段,直接執(zhí)行編譯好的機器碼。
除了針對JDK做優(yōu)化之外,還可以采用另外一種方式來解決這個問題,那就是做預熱。
很多人都聽說過緩存預熱,其實思想是類似的。
就是說在應(yīng)用剛剛啟動的時候,通過調(diào)節(jié)負載均衡,不要很快的把大流量分發(fā)給他,而是先分給他一小部分流量,通過這部分流量來觸發(fā)JIT優(yōu)化,等優(yōu)化好了之后,再把流量調(diào)大。
總結(jié)
本文介紹了一下JIT優(yōu)化的時機以及原理,我們今天討論的問題不是JIT優(yōu)化導致的,而JIT優(yōu)化的出現(xiàn)恰恰是要解決這樣的問題的。
但是這個知識點卻和JIT優(yōu)化息息相關(guān)?;蛘哒f有些問題JIT優(yōu)化并沒辦法徹底解決,我們可以幫助JIT優(yōu)化做一些優(yōu)化。
技術(shù)交流群
最近有很多人問,有沒有讀者交流群,想知道怎么加入。
最近我創(chuàng)建了一些群,大家可以加入。交流群都是免費的,只需要大家加入之后不要隨便發(fā)廣告,多多交流技術(shù)就好了。
目前創(chuàng)建了多個交流群,全國交流群、北上廣杭深等各地區(qū)交流群、面試交流群、資源共享群等。
有興趣入群的同學,可長按掃描下方二維碼,一定要備注:全國 Or 城市 Or 面試 Or 資源,根據(jù)格式備注,可更快被通過且邀請進群。
▲長按掃描
往期推薦 我開源的軟件只能我拿來賺錢92年清華本科,做了30年技術(shù),43歲在CTO的位置上被優(yōu)化!找了一年多工作,有些迷茫!360變相裁員!以代打卡為由強行裁員,不給賠償!如果你喜歡本文,
請長按二維碼,關(guān)注?Hollis.
轉(zhuǎn)發(fā)至朋友圈,是對我最大的支持。
點個?在看?
喜歡是一種感覺
在看是一種支持
↘↘↘
總結(jié)
以上是生活随笔為你收集整理的阿里终面:为什么应用刚启动的时候比较卡,过一会就好了?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python如何设置窗口保持显示_如何保
- 下一篇: 简历准备及面试技巧,你应该知道的一切