最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot應(yīng)用剛啟動(dòng)時(shí)服務(wù)報(bào)大量超時(shí)的問題及解決

 更新時(shí)間:2024年11月05日 09:14:57   作者:萊特昂  
在Java項(xiàng)目上線過程中,經(jīng)常遇到的超時(shí)問題主要是由于JVM的JIT編譯導(dǎo)致,JIT(Just-In-Time)編譯是Java虛擬機(jī)的一項(xiàng)技術(shù),用于提高Java應(yīng)用的性能,它通過將熱點(diǎn)代碼(頻繁執(zhí)行的部分)轉(zhuǎn)換成本地機(jī)器碼來優(yōu)化執(zhí)行效率

1、背景

部門剛轉(zhuǎn)Java時(shí),每次項(xiàng)目更新線上的時(shí)候,都會(huì)報(bào)大量超時(shí)的問題。

雖然操作非常緩慢且小心,按照摘除負(fù)載、更新容器、等待一段時(shí)間、恢復(fù)負(fù)載的嚴(yán)格步驟來操作,Nginx那邊依然會(huì)報(bào)許多的503超時(shí)告警。搞得之后每次更新線上都膽戰(zhàn)心驚。

后來采用了在服務(wù)起來之后,自動(dòng)調(diào)用所有的接口進(jìn)行預(yù)熱,暫時(shí)的解決了這個(gè)問題。服務(wù)更新啟動(dòng)后也不會(huì)再報(bào)超時(shí)的錯(cuò)誤了。

最近在網(wǎng)上也看到了類似的情況,表現(xiàn)為應(yīng)用在剛剛啟動(dòng)之后,前幾次訪問都會(huì)比較卡頓,RT都會(huì)比極高,在運(yùn)行一段時(shí)間之后,就會(huì)順暢很多了。

2、原因

看來是SpringBoot應(yīng)用的通病,所以就網(wǎng)上搜集了一波資料,研究下具體的原因。

主要原因是JIT編譯。

我們知道,想要把高級(jí)語言轉(zhuǎn)變成計(jì)算機(jī)認(rèn)識(shí)的機(jī)器語言有兩種方式,分別是編譯和解釋,雖然Java轉(zhuǎn)成機(jī)器語言的過程中有一個(gè)步驟是要編譯成字節(jié)碼,但是,這里的字節(jié)碼并不能在機(jī)器上直接執(zhí)行。

所以,JVM中內(nèi)置了解釋器(interpreter),在運(yùn)行時(shí)對(duì)字節(jié)碼進(jìn)行解釋翻譯成機(jī)器碼,然后再執(zhí)行。

解釋器的執(zhí)行方式是一邊翻譯,一邊執(zhí)行,因此執(zhí)行效率很低。為了解決這樣的低效問題,HotSpot引入了JIT技術(shù)(Just-In-Time)。

JIT 代表即時(shí)編譯(Just In Time compilation),當(dāng)代碼執(zhí)行的次數(shù)超過一定的閾值時(shí),會(huì)將 Java 字節(jié)碼轉(zhuǎn)換為本地代碼,如,主要的熱點(diǎn)代碼會(huì)被準(zhǔn)換為本地代碼,這樣有利大幅度提高 Java 應(yīng)用的性能。

有了JIT技術(shù)之后,JVM還是通過解釋器進(jìn)行解釋執(zhí)行。但是,當(dāng)JVM發(fā)現(xiàn)某個(gè)方法或代碼塊運(yùn)行時(shí)執(zhí)行的特別頻繁的時(shí)候,就會(huì)認(rèn)為這是“熱點(diǎn)代碼”(Hot Spot Code)。然后JIT會(huì)把部分“熱點(diǎn)代碼”翻譯成本地機(jī)器相關(guān)的機(jī)器碼,并進(jìn)行優(yōu)化,然后再把翻譯后的機(jī)器碼緩存起來,以備下次使用。

這也是HotSpot虛擬機(jī)的名字的由來。

大家理解了JIT編譯的原理之后,其實(shí)可以知道,JIT優(yōu)化是在運(yùn)行期進(jìn)行的,并且也不是Java進(jìn)程剛一啟動(dòng)就能優(yōu)化的,是需要先執(zhí)行一段時(shí)間的,因?yàn)樗枰戎滥男┦菬狳c(diǎn)代碼。

所以,在IT優(yōu)化開始之前,我們的所有請(qǐng)求,都是要經(jīng)過解釋執(zhí)行的,這個(gè)過程就會(huì)相對(duì)慢一些。

而且,如果你們的應(yīng)用的請(qǐng)求量比較大的的話,這種問題就會(huì)更加明顯,在應(yīng)用啟動(dòng)過程中,會(huì)有大量的請(qǐng)求過來,這就會(huì)導(dǎo)致解釋器持續(xù)的在努力工作。

一旦解釋器對(duì)CPU資源占用比較大的話,就會(huì)間接的導(dǎo)致CPU、LOAD等飆高,導(dǎo)致應(yīng)用的性能進(jìn)一步下降。

這也是為什么很多應(yīng)用在發(fā)布過程中,會(huì)出現(xiàn)剛剛重啟好的應(yīng)用會(huì)發(fā)生大量的超時(shí)問題了。

而隨著請(qǐng)求的不斷增多,JIT優(yōu)化就會(huì)被觸發(fā),這就是使得后續(xù)的熱點(diǎn)請(qǐng)求的執(zhí)行可能就不需要在通過解釋執(zhí)行了,直接運(yùn)行JIT優(yōu)化后緩存的機(jī)器碼就行了。

3、解決

那么,怎么解決這樣的問題呢?

主要有兩種思路:

  • 1、提升JIT優(yōu)化的效率
  • 2、降低瞬時(shí)請(qǐng)求量

在提升JIT優(yōu)化效率的設(shè)計(jì)上,大家可以了解一下阿里研發(fā)的JDK——Dragonwell。

這個(gè)相比OpenJDK提供了一些專有特性,其中一項(xiàng)叫做JwarmUp的技術(shù)就是解決JIT優(yōu)化效率的問題的。

這個(gè)技術(shù)主要是通過記錄Java應(yīng)用上一次運(yùn)行時(shí)候的編譯信息到文件中,在下次應(yīng)用啟動(dòng)時(shí),讀取該文件,從而在流量進(jìn)來之前,提前完成類的加載、初始化和方法編譯,從而跳過解釋階段,直接執(zhí)行編譯好的機(jī)器碼。

除了針對(duì)JDK做優(yōu)化之外,還可以采用另外一種方式來解決這個(gè)問題,那就是做預(yù)熱。

很多人都聽說過緩存預(yù)熱,其實(shí)思想是類似的。

就是說在應(yīng)用剛剛啟動(dòng)的時(shí)候,通過調(diào)節(jié)負(fù)載均衡,不要很快的把大流量分發(fā)給他,而是先分給他一小部分流量,通過這部分流量來觸發(fā)JIT優(yōu)化,等優(yōu)化好了之后,再把流量調(diào)大。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談Synchronized和Lock的區(qū)別

    淺談Synchronized和Lock的區(qū)別

    這篇文章主要介紹了淺談Synchronized和Lock的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 深入學(xué)習(xí)Java單元測(cè)試(Junit+Mock+代碼覆蓋率)

    深入學(xué)習(xí)Java單元測(cè)試(Junit+Mock+代碼覆蓋率)

    在做單元測(cè)試時(shí),代碼覆蓋率常常被拿來作為衡量測(cè)試好壞的指標(biāo),甚至,用代碼覆蓋率來考核測(cè)試任務(wù)完成情況,比如,代碼覆蓋率必須達(dá)到80%或 90%。下面我們就來詳細(xì)學(xué)習(xí)下java單元測(cè)試吧
    2019-06-06
  • Java利用openoffice將doc、docx轉(zhuǎn)為pdf實(shí)例代碼

    Java利用openoffice將doc、docx轉(zhuǎn)為pdf實(shí)例代碼

    這篇文章主要介紹了Java利用openoffice將doc、docx轉(zhuǎn)為pdf實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java實(shí)現(xiàn)順序棧原理解析

    Java實(shí)現(xiàn)順序棧原理解析

    這篇文章主要介紹了Java實(shí)現(xiàn)順序棧原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java8新特性之StampedLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java8新特性之StampedLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    本文從synchronized、Lock到Java8新增的StampedLock進(jìn)行對(duì)比分析,對(duì)Java8新特性之StampedLock相關(guān)知識(shí)感興趣的朋友一起看看吧
    2017-06-06
  • SpringBoot注入自定義的配置文件的方法詳解

    SpringBoot注入自定義的配置文件的方法詳解

    在實(shí)際的項(xiàng)目開發(fā)過程中,我們經(jīng)常需要將某些變量從代碼里面抽離出來,放在配置文件里面。今天,我們就一起來聊一聊SpringBoot加載配置文件的幾種玩法,需要的可以參考一下
    2022-09-09
  • 基于SpringBoot實(shí)現(xiàn)多文件批量下載并打包為ZIP壓縮包的完整解決方案

    基于SpringBoot實(shí)現(xiàn)多文件批量下載并打包為ZIP壓縮包的完整解決方案

    在日常的 Web 開發(fā)中,文件下載是非常常見的功能需求,而多文件批量下載并打包為 ZIP 壓縮包 更是高頻場景(比如批量下載合同、圖片、報(bào)表等),本文將基于 SpringBoot 框架,手把手教你實(shí)現(xiàn)這一功能,從核心思路到完整代碼,讓你快速掌握,需要的朋友可以參考下
    2026-02-02
  • SpringBoot中如何使用Assert進(jìn)行斷言校驗(yàn)

    SpringBoot中如何使用Assert進(jìn)行斷言校驗(yàn)

    Java?提供了內(nèi)置的?assert?機(jī)制,而?Spring?框架也提供了更強(qiáng)大的?Assert?工具類來幫助開發(fā)者進(jìn)行參數(shù)校驗(yàn)和狀態(tài)檢查,下面我們就來看看SpringBoot中如何使用Assert進(jìn)行斷言校驗(yàn)吧
    2025-07-07
  • java中BigDecimal的使用踩坑記錄

    java中BigDecimal的使用踩坑記錄

    這篇文章主要為大家詳細(xì)介紹了java中使用BigDecimal會(huì)踩坑的地方以及相關(guān)的解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Java enum 對(duì)枚舉元素的賦值和取值方式

    Java enum 對(duì)枚舉元素的賦值和取值方式

    這篇文章主要介紹了Java enum 對(duì)枚舉元素的賦值和取值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論

乐东| 隆德县| 德州市| 利津县| 韩城市| 漠河县| 启东市| 利津县| 定远县| 木兰县| 鸡泽县| 自治县| 兴义市| 新野县| 建阳市| 安达市| 榆中县| 田东县| 贵阳市| 漯河市| 句容市| 白沙| 鄂州市| 永丰县| 弥勒县| 新昌县| 连南| 托里县| 益阳市| 吕梁市| 繁昌县| 定陶县| 屏边| 连平县| 集贤县| 霍山县| 厦门市| 中牟县| 菏泽市| 丹阳市| 张家川|