JVM-TLAB

TLAB(Thread Local Allocation Buffer)為一個(gè)HotSpot虛擬機(jī)的方案:

每個(gè)線程在Java堆中預(yù)先分配一小塊內(nèi)存,然后再給對(duì)象分配內(nèi)存的時(shí)候,直接在自己這塊”私有”內(nèi)存中分配,當(dāng)這部分區(qū)域用完之后,再分配新的”私有”內(nèi)存。

TLAB是虛擬機(jī)在堆內(nèi)存的eden劃分出來(lái)的一塊專用空間,是線程專屬的。在虛擬機(jī)的TLAB功能啟動(dòng)的情況下,在線程初始化時(shí),虛擬機(jī)會(huì)為每個(gè)線程分配一塊TLAB空間,只給當(dāng)前線程使用,這樣每個(gè)線程都單獨(dú)擁有一個(gè)空間,如果需要分配內(nèi)存,就在自己的空間上分配,這樣就不存在競(jìng)爭(zhēng)的情況,可以大大提升分配效率。

TLAB是堆內(nèi)存的一部分,他在讀取上確實(shí)是線程共享的,但是在內(nèi)存分分配上,是線程獨(dú)享的。

源自網(wǎng)絡(luò)

TLAB默認(rèn)是eden區(qū)的1%,可以通過(guò)選項(xiàng)-XX:TLABWasteTargetPercent設(shè)置TLAB空間所占用Eden空間的百分比大小。

===>分配空間問(wèn)題

TLAB的空間其實(shí)并不大,所以大對(duì)象還是可能需要在堆內(nèi)存中直接分配。那么,對(duì)象的內(nèi)存分配步驟就是先嘗試TLAB分配,空間不足之后,再判斷是否應(yīng)該直接進(jìn)入老年代,然后再確定是在eden分配還是在老年代分配。

相關(guān)判斷:虛擬機(jī)定義了一個(gè)refill_waste的值,這個(gè)值可以翻譯為“最大浪費(fèi)空間”

當(dāng)請(qǐng)求分配的內(nèi)存大于refill_waste的時(shí)候,會(huì)選擇在堆內(nèi)存中分配。

若小于refill_waste值,則會(huì)廢棄當(dāng)前TLAB,重新創(chuàng)建TLAB進(jìn)行對(duì)象內(nèi)存分配。

源自網(wǎng)絡(luò)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容