您好,登錄后才能下訂單哦!
什么是TLAB線程本地分配緩存區?工作原理分析,TLAB全稱Thread Local Allocation Buffer,即線程本地分配緩存區,是一個線程專用的內存分配區域。在線程初始化時,虛擬機會為每個線程分配一塊TLAB空間,只給當前線程使用。
TLAB是虛擬機在堆內存的eden劃分出來的一塊專用空間線程專屬。在虛擬機的TLAB功能啟動的情況下,在線程初始化時,虛擬機會為每個線程分配一塊TLAB空間,只給當前線程使用,這樣每個線程都單獨擁有一個空間,如需要分配內存,在自己的空間上分配,在不存在競爭的情況大大提升分配效率。
上面描述中"線程專屬"、"只給當前線程使用"、"每個線程單獨擁有"的描述怎么理解呢?因TLAB技術,堆內存并不是完完全全的線程共享,其eden區域中還是有一部分空間是分配給線程獨享的。TLAB是線程獨享的,但只在“分配”這個動作上是線程獨享,在讀取、垃圾回收等動作上是線程共享,且在使用上也沒有什么區別。
每個線程在初始化時都會去堆內存中申請一塊TLAB,并不是說這個TLAB區域的內存其他線程就完全無法訪問,其他線程讀取也可以,只不過無法在這個區域中分配內存而已。在TLAB分配之后不影響對象的移動和回收。雖然對象剛開始可能通過TLAB分配內存,存放在Eden區,但是還是會被垃圾回收或者被移到Survivor Space、Old Gen等。
TLAB是在eden區分配,eden區域本身就不太大,TLAB空間的內存也非常小,默認情況下僅占有整個Eden空間的1%,存在一些大對象是無法在TLAB直接分配。TLAB中無法分配的大對象,對象還是可能在eden區或者老年代等進行分配的,但這種分配就需要進行同步控制,這也是大家經常說的小的對象比大的對象分配起來更加高效。
如果設置了虛擬機參數 -XX:UseTLAB,在線程初始化時,同時也會申請一塊指定大小的內存,只給當前線程使用,這樣每個線程都單獨擁有一個空間,如果需要分配內存,就在自己的空間上分配就不存在競爭還可以大大提升分配效率。
TLAB空間的內存非常小,缺省情況下僅占有整個Eden空間的1%,也可以通過選項-XX:TLABWasteTargetPercent設置TLAB空間所占用Eden空間的百分比大小。TLAB的本質其實是三個指針管理的區域:start,top 和 end,每個線程都會從Eden分配一塊空間,例如說100KB,作為自己的TLAB,其中 start 和 end 是占位用的,標識出 eden 里被這個 TLAB 所管理的區域,卡住eden里的一塊空間不讓其它線程來這里分配。
關于什么是TLAB線程本地分配緩存區就分享到這里了,當然并不止以上和大家分析的辦法,不過小編可以保證其準確性是絕對沒問題的。希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。