吞吐量、延遲、內(nèi)存:深入理解垃圾回收的“三元悖論”
垃圾回收算法的評(píng)價(jià)標(biāo)準(zhǔn):吞吐量、延遲、內(nèi)存,孰輕孰重?
評(píng)估和選擇垃圾回收器時(shí),不存在一體通用的最優(yōu)解。不同的應(yīng)用場(chǎng)景對(duì)性能的要求截然不同,因此需要通過一套標(biāo)準(zhǔn)化的指標(biāo)來衡量垃圾回收算法的特性。通常,關(guān)注三個(gè)主要的、且相互制約的評(píng)價(jià)指標(biāo):吞吐量(Throughput)、最大暫停時(shí)間(Max Pause Time / Latency)以及堆使用效率(Heap Usage Efficiency)。
吞吐量
在計(jì)算機(jī)科學(xué)領(lǐng)域,吞吐量泛指單位時(shí)間內(nèi)完成的工作量。在垃圾回收的上下文中,吞吐量有一個(gè)更精確的定義:應(yīng)用程序代碼運(yùn)行時(shí)間占總運(yùn)行時(shí)間(應(yīng)用程序代碼運(yùn)行時(shí)間 + GC運(yùn)行時(shí)間)的比例。其公式為:
Throughput= Application Time+GC Time/Application Time
高吞吐量意味著垃圾回收占用的處理器時(shí)間片較少,應(yīng)用程序能夠?qū)⒏嗟挠?jì)算資源投入到執(zhí)行實(shí)際的業(yè)務(wù)邏輯中。因此,對(duì)于那些追求極致計(jì)算性能、對(duì)單次暫停不敏感的后臺(tái)計(jì)算密集型任務(wù),如科學(xué)計(jì)算、大數(shù)據(jù)批處理、ETL作業(yè)等,應(yīng)優(yōu)先選擇以高吞吐量為目標(biāo)的垃圾回收器(如Parallel GC)。這類應(yīng)用的最終目標(biāo)是盡快完成整個(gè)任務(wù),即使過程中有幾次較長(zhǎng)的停頓也是可以接受的。
最大暫停時(shí)間
最大暫停時(shí)間是指垃圾回收過程中應(yīng)用程序的最長(zhǎng)停頓時(shí)間。在垃圾回收過程中,應(yīng)用程序的線程可能會(huì)被暫停,以便垃圾回收線程可以找到并清理無用的對(duì)象。如果暫停時(shí)間過長(zhǎng),用戶可能會(huì)感到應(yīng)用程序卡頓或無響應(yīng)。
因此,對(duì)于需要快速響應(yīng)的應(yīng)用程序,如用戶界面、在線交易系統(tǒng)或?qū)崟r(shí)系統(tǒng),應(yīng)選擇最大暫停時(shí)間短的垃圾回收算法。例如,一些并發(fā)和增量垃圾回收算法就是通過犧牲一部分吞吐量來降低最大暫停時(shí)間。
最大暫停時(shí)間,也常被稱為延遲(Latency),是指在整個(gè)垃圾回收周期中,由“Stop-the-world”導(dǎo)致的應(yīng)用程序最長(zhǎng)的一次停頓時(shí)間。在STW期間,所有應(yīng)用線程都會(huì)被完全凍結(jié),無法響應(yīng)任何外部請(qǐng)求或執(zhí)行任何任務(wù)。這種暫停會(huì)直接影響應(yīng)用的響應(yīng)性。如果暫停時(shí)間過長(zhǎng),用戶可能會(huì)感到界面卡頓、請(qǐng)求超時(shí)或系統(tǒng)無響應(yīng),這在交互式應(yīng)用中是致命的。
因此,對(duì)于需要與用戶實(shí)時(shí)交互或?qū)憫?yīng)時(shí)間有嚴(yán)格要求的應(yīng)用,如Web服務(wù)器、在線交易系統(tǒng)、微服務(wù)網(wǎng)關(guān),控制最大暫停時(shí)間是首要目標(biāo)。開發(fā)者會(huì)選擇那些旨在縮短停頓時(shí)間的垃圾回收器,例如CMS、G1,乃至以超低延遲為目標(biāo)的ZGC和Shenandoah。
堆使用效率
堆使用效率衡量的是垃圾回收算法對(duì)Java堆內(nèi)存的利用情況。一個(gè)高效率的垃圾回收算法,可以用更少的內(nèi)存空間來支撐同樣規(guī)模的應(yīng)用運(yùn)行,或者說,在給定的堆大小下,留給應(yīng)用程序自由分配的“凈空間”更大。
影響堆使用效率的因素主要有兩個(gè)方面:
1)垃圾回收自身的數(shù)據(jù)結(jié)構(gòu)開銷:例如,G1需要使用記憶集(Remembered Sets)來記錄跨區(qū)引用,這會(huì)占用一部分堆內(nèi)存。
2)堆的碎片化程度:一些不帶壓縮整理階段的垃圾回收算法(如CMS)會(huì)產(chǎn)生大量?jī)?nèi)存碎片,導(dǎo)致雖然總的空閑內(nèi)存很多,但沒有足夠大的連續(xù)空間來分配一個(gè)大對(duì)象,從而提前觸發(fā)Full GC。
提高堆使用效率通常也需要付出代價(jià)。例如,為了進(jìn)行空間整理以消除碎片,垃圾回收器需要移動(dòng)大量對(duì)象,這會(huì)增加處理器的消耗和暫停時(shí)間??偟膩碚f,堆使用效率、吞吐量和最大暫停時(shí)間構(gòu)成了一個(gè)“不可能三角”,無法同時(shí)將三者都優(yōu)化到極致。
一個(gè)簡(jiǎn)單的經(jīng)驗(yàn)法則是:更大的堆內(nèi)存通常能帶來更短的垃圾回收時(shí)間和更高的吞吐量,因?yàn)槔厥湛梢越档瓦\(yùn)行頻率,且有更多空間進(jìn)行對(duì)象騰挪;反之,若要在有限的堆內(nèi)存下運(yùn)行,垃圾回收必然會(huì)更加頻繁和耗時(shí),從而影響吞吐量和延遲。
未完待續(xù)
很高興與你相遇!如果你喜歡本文內(nèi)容,記得關(guān)注哦
本文來自博客園,作者:poemyang,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/poemyang/p/19190882
posted on 2025-11-04 17:11 poemyang 閱讀(102) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)