溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是TLAB線程本地分配緩存區(qū)?

發(fā)布時間:2020-03-25 10:37:07 來源:億速云 閱讀:404 作者:小新 欄目:編程語言

  什么是TLAB線程本地分配緩存區(qū)?工作原理分析,TLAB全稱Thread Local Allocation Buffer,即線程本地分配緩存區(qū),是一個線程專用的內(nèi)存分配區(qū)域。在線程初始化時,虛擬機會為每個線程分配一塊TLAB空間,只給當前線程使用。

什么是TLAB線程本地分配緩存區(qū)?
  TLAB是虛擬機在堆內(nèi)存的eden劃分出來的一塊專用空間線程專屬。在虛擬機的TLAB功能啟動的情況下,在線程初始化時,虛擬機會為每個線程分配一塊TLAB空間,只給當前線程使用,這樣每個線程都單獨擁有一個空間,如需要分配內(nèi)存,在自己的空間上分配,在不存在競爭的情況大大提升分配效率。
  上面描述中"線程專屬"、"只給當前線程使用"、"每個線程單獨擁有"的描述怎么理解呢?因TLAB技術(shù),堆內(nèi)存并不是完完全全的線程共享,其eden區(qū)域中還是有一部分空間是分配給線程獨享的。TLAB是線程獨享的,但只在“分配”這個動作上是線程獨享,在讀取、垃圾回收等動作上是線程共享,且在使用上也沒有什么區(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)常說的小的對象比大的對象分配起來更加高效。
  如果設(shè)置了虛擬機參數(shù) -XX:UseTLAB,在線程初始化時,同時也會申請一塊指定大小的內(nèi)存,只給當前線程使用,這樣每個線程都單獨擁有一個空間,如果需要分配內(nèi)存,就在自己的空間上分配就不存在競爭還可以大大提升分配效率。
  TLAB空間的內(nèi)存非常小,缺省情況下僅占有整個Eden空間的1%,也可以通過選項-XX:TLABWasteTargetPercent設(shè)置TLAB空間所占用Eden空間的百分比大小。TLAB的本質(zhì)其實是三個指針管理的區(qū)域:start,top 和 end,每個線程都會從Eden分配一塊空間,例如說100KB,作為自己的TLAB,其中 start 和 end 是占位用的,標識出 eden 里被這個 TLAB 所管理的區(qū)域,卡住eden里的一塊空間不讓其它線程來這里分配。

  關(guān)于什么是TLAB線程本地分配緩存區(qū)就分享到這里了,當然并不止以上和大家分析的辦法,不過小編可以保證其準確性是絕對沒問題的。希望以上內(nèi)容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI