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ú)享的。

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)存分配。
