1.TLAB 分配概念:
TLAB粥鞋,全稱Thread Local Allocation Buffer, 即:線程本地分配緩存础锐。這是一塊線程專用的內(nèi)存分配區(qū)域瞭郑。TLAB占用的是eden區(qū)的空間胳徽。在TLAB啟用的情況下(默認(rèn)開啟),JVM會(huì)為每一個(gè)線程分配一塊TLAB區(qū)域
1.1 為什么需要TLAB灭美?
這是為了加速對(duì)象的分配推溃。由于對(duì)象一般分配在堆上,而堆是線程共用的届腐,因此可能會(huì)有多個(gè)線程在堆上申請(qǐng)空間铁坎,而每一次的對(duì)象分配都必須線程同步,會(huì)使分配的效率下降犁苏∮财迹考慮到對(duì)象分配幾乎是Java中最常用的操作,因此JVM使用了TLAB這樣的線程專有區(qū)域來(lái)避免多線程沖突围详,提高對(duì)象分配的效率朴乖。
1.2 局限性:
TLAB空間一般不會(huì)太大(占用eden區(qū)),所以大對(duì)象無(wú)法進(jìn)行TLAB分配助赞,只能直接分配到堆上买羞。
1.3 分配策略:
一個(gè)100KB的TLAB區(qū)域,如果已經(jīng)使用了80KB雹食,當(dāng)需要分配一個(gè)30KB的對(duì)象時(shí)畜普,TLAB是如何分配的呢?
? ?此時(shí)群叶,虛擬機(jī)有兩種選擇:第一漠嵌,廢棄當(dāng)前的TLAB(會(huì)浪費(fèi)20KB的空3.4 間);第二盖呼,將這個(gè)30KB的對(duì)象直接分配到堆上,保留當(dāng)前TLAB(當(dāng)有小于20KB的對(duì)象請(qǐng)求TLAB分配時(shí)可以直接使用該TLAB區(qū)域)化撕。
JVM選擇的策略是:在虛擬機(jī)內(nèi)部維護(hù)一個(gè)叫refill_waste的值几晤,當(dāng)請(qǐng)求對(duì)象大于refill_waste時(shí),會(huì)選擇在堆中分配植阴,反之蟹瘾,則會(huì)廢棄當(dāng)前TLAB圾浅,新建TLAB來(lái)分配新對(duì)象。
【默認(rèn)情況下憾朴,TLAB和refill_waste都是會(huì)在運(yùn)行時(shí)不斷調(diào)整的狸捕,使系統(tǒng)的運(yùn)行狀態(tài)達(dá)到最優(yōu)】
1.4 JVM參數(shù)解析
-XX:+UseTLAB啟用TLAB默認(rèn)啟用
-XX:TLABRefillWasteFraction設(shè)置允許空間浪費(fèi)的比例默認(rèn)值:64,即:使用1/64的TLAB空間大小作為refill_waste值
-XX:-ResizeTLAB禁止系統(tǒng)自動(dòng)調(diào)整TLAB大小?
-XX:TLABSize指定TLAB大小單位:B,默認(rèn)0
-XX:+EliminateAllocations 標(biāo)量替換(默認(rèn)打開),允許將對(duì)象打散分配到棧上