TLAB對象分配

首先看一個問題:Java對象的內(nèi)存分配過程是如何保證線程安全的大磺?

對象的內(nèi)存分配過程中贡歧,主要是對象的引用指向這個內(nèi)存區(qū)域滩租,然后進行初始化操作。

但是艘款,因為堆是全局共享的持际,因此在同一時間,可能有多個線程在堆上申請空間哗咆,在并發(fā)場景中蜘欲,就會存在兩個線程先后把對象引用指向了同一個內(nèi)存區(qū)域。如圖:


為了解決這個并發(fā)問題晌柬,對象的內(nèi)存分配過程就必須進行同步控制姥份。但是無論是使用哪種同步方案(實際上虛擬機使用的可能是CAS),都會影響內(nèi)存的分配效率年碘。所以就有了一個HotSpot虛擬機的解決方案澈歉,這種方案被稱之為TLAB分配,即Thread Local Allocation Buffer屿衅。這部分Buffer是從堆中劃分出來的埃难,但是是本地線程獨享的。TLAB只是HotSpot虛擬機的一個優(yōu)化方案涤久,不代表所有的虛擬機都有這個特性涡尘。

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

1. 什么是TLAB

TLAB是虛擬機在堆內(nèi)存的eden劃分出來的一塊專用空間川梅,是線程專屬的。在虛擬機的TLAB功能啟動的情況下然遏,在線程初始化時贫途,虛擬機會為每個線程分配一塊TLAB空間,只給當(dāng)前線程使用待侵,這樣每個線程都單獨擁有一個空間潮饱,如果需要分配內(nèi)存,就在自己的空間上分配诫给,這樣就不存在競爭的情況香拉,可以大大提升分配效率啦扬。

所以說,因為有了TLAB技術(shù)凫碌,堆內(nèi)存是線程共享的這個命題是不準(zhǔn)確的扑毡,其eden區(qū)域中還是有一部分空間是分配給線程獨享的。

雖然說TLAB是線程獨享的盛险,但是只是在分配這個動作上是線程獨享的瞄摊,至于在讀取、垃圾回收等動作上都是線程共享的苦掘。而且在使用上也沒有什么區(qū)別换帜。

雖然每個線程在初始化時都會去堆內(nèi)存中申請一塊TLAB,并不是說這個TLAB區(qū)域的內(nèi)存其他線程就完全無法訪問了鹤啡,其他線程的讀取還是可以的惯驼,只不過無法在這個區(qū)域中分配內(nèi)存而已。并且递瑰,在TLAB分配之后祟牲,并不影響對象的移動和回收,也就是說抖部,雖然對象剛開始可能通過TLAB分配內(nèi)存说贝,存放在Eden區(qū),但是還是會被垃圾回收或者被移到Survivor Space慎颗、Old Gen等乡恕。


有一點需要注意的是,我們說TLAB是在eden區(qū)分配的俯萎,因為eden區(qū)域本身就不太大傲宜,而且TLAB空間的內(nèi)存也非常小,默認情況下僅占有整個Eden空間的1%讯屈。所以,必然存在一些大對象是無法在TLAB直接分配县习。遇到TLAB中無法分配的大對象涮母,對象還是可能在eden區(qū)或者老年代等進行分配的,但是這種分配就需要進行同步控制躁愿,這也是經(jīng)常說的:小的對象比大的對象分配起來更加高效叛本。

2. 完整的對象分配

通過上面說的可以得出結(jié)論,對象分配的全過程如下圖:


TLAB的空間并不大彤钟,所以大對象還是可能需要在堆內(nèi)存中直接分配来候。對象的內(nèi)存分配步驟就是先嘗試TLAB分配,空間不足之后逸雹,再判斷是否應(yīng)該直接進入老年代营搅,然后再確定是再eden分配還是在老年代分配云挟。

3. TLAB帶來的問題

因為TLAB內(nèi)存區(qū)域并不是很大,所以有可能會經(jīng)常出現(xiàn)TLAB內(nèi)存區(qū)域不夠的情況转质。在《實戰(zhàn)Java虛擬機》中有這樣一個例子:

比如一個線程的TLAB空間有100KB园欣,其中已經(jīng)使用了80KB,當(dāng)需要再分配一個30KB的對象時休蟹,就無法直接在TLAB中分配沸枯,遇到這種情況時,有兩種處理方案:

  1. 如果一個對象需要的空間大小超過TLAB中剩余的空間大小赂弓,則直接在堆內(nèi)存中對該對象進行內(nèi)存分配绑榴。
  2. 如果一個對象需要的空間大小超過TLAB中剩余的空間大小,則廢棄當(dāng)前TLAB盈魁,重新申請TLAB空間再次進行內(nèi)存分配翔怎。

以上兩個方案各有利弊,如果采用方案1备埃,那么就可能存在著一種極端情況姓惑,就是TLAB只剩下1KB,就會導(dǎo)致后續(xù)需要分配的大多數(shù)對象都需要在堆內(nèi)存直接分配按脚。

如果采用方案2于毙,也有可能存在頻繁廢棄TLAB,頻繁申請TLAB的情況辅搬,雖然在TLAB上分配內(nèi)存是線程獨享的唯沮,但是TLAB內(nèi)存自己從堆中劃分出來的過程確實可能存在沖突的,所以堪遂,TLAB的分配過程其實也是需要并發(fā)控制的介蛉。而頻繁的TLAB分配就失去了使用TLAB的意義。

為了解決這兩個方案存在的問題溶褪,虛擬機定義了一個refill_waste的值币旧,這個值可以翻譯為最大浪費空間
當(dāng)請求分配的內(nèi)存大于refill_waste的時候猿妈,會選擇在堆內(nèi)存中分配吹菱。若小于refill_waste值,則會廢棄當(dāng)前TLAB彭则,重新創(chuàng)建TLAB進行對象內(nèi)存分配鳍刷。

前面的例子中,TLAB總空間100KB俯抖,使用了80KB输瓜,剩余20KB,如果設(shè)置的refill_waste的值為25KB,那么如果新對象的內(nèi)存大于25KB尤揣,則直接堆內(nèi)存分配搔啊,如果小于25KB,則會廢棄掉之前的那個TLAB芹缔,重新分配一個TLAB空間坯癣,給新對象分配內(nèi)存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末最欠,一起剝皮案震驚了整個濱河市示罗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芝硬,老刑警劉巖蚜点,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拌阴,居然都是意外死亡绍绘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門迟赃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陪拘,“玉大人,你說我怎么就攤上這事纤壁∽蠊簦” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵酌媒,是天一觀的道長欠痴。 經(jīng)常有香客問我,道長秒咨,這世上最難降的妖魔是什么喇辽? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮雨席,結(jié)果婚禮上菩咨,老公的妹妹穿的比我還像新娘。我一直安慰自己陡厘,他們只是感情好抽米,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雏亚,像睡著了一般缨硝。 火紅的嫁衣襯著肌膚如雪摩钙。 梳的紋絲不亂的頭發(fā)上罢低,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音,去河邊找鬼网持。 笑死宜岛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的功舀。 我是一名探鬼主播萍倡,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辟汰!你這毒婦竟也來了列敲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤帖汞,失蹤者是張志新(化名)和其女友劉穎戴而,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翩蘸,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡所意,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了催首。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扶踊。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖郎任,靈堂內(nèi)的尸體忽然破棺而出秧耗,到底是詐尸還是另有隱情,我是刑警寧澤涝滴,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布绣版,位于F島的核電站,受9級特大地震影響歼疮,放射性物質(zhì)發(fā)生泄漏杂抽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一韩脏、第九天 我趴在偏房一處隱蔽的房頂上張望缩麸。 院中可真熱鬧,春花似錦赡矢、人聲如沸杭朱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弧械。三九已至,卻和暖如春空民,著一層夾襖步出監(jiān)牢的瞬間刃唐,已是汗流浹背羞迷。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留画饥,地道東北人衔瓮。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像抖甘,于是被迫代替她去往敵國和親热鞍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容