【Java虛擬機】什麼是對象分配過程中的TLAB?

1 爲什麼要有TLAB?

TLAB的全稱是:Thread Local Allocation Buffer,翻譯過來意思是線程本地緩衝內存。

  • 在內存分配過程中,堆區是線程共享的區域,任何線程都可以反問到堆區中的共享數據。
  • 由於對象的實例創建在JVM中非常頻繁,因此在併發環境下從堆區中劃分內存空間是線程不安全的(有可能出現多個線程同時想要同一塊內存的情況)
  • 爲了避免多個線程操作同一個地址,需要使用加鎖等機制,進而影響分配速度。

2 什麼是TLAB?

  • 從內存模型的角度來說,對Eden區繼續進行劃分,JVM爲每個線程分配了一個私有的緩衝區域,這個區域包含在Eden空間內。
  • 多線程同時分配內存時,使用TLAB可以避免一系列的線程安全問題。同時還能夠提升內存分配的吞吐量。因此我們可以將這種內存分配方式稱爲快速分配策略。
  • 所有的OpenJDK衍生出來的JVM都提供了TLAB的設計。

3 其他說明

  • 儘管不是所有的對象實例都能夠在TLAB中成功分配,單JVM確實將TLAB作爲內存分配的首選。(因爲線程緩衝區域很小,大對象無法容納)
  • 在程序中,開發人員可以通過首選項:“-XX:UseTLAB”設置是否開啓TBLAB空間。
  • 默認情況下,TLAB的空間的內存非常小,僅佔有整個Eden空間的1%,當然我們可以通過首選項“-XXTLABWasteTargetPercent”設置TLAB空間所佔Eden空間的百分比大小。
  • 一旦對象在TLAB空間內存分配失敗時,JVM機會嘗試通過使用加鎖機制確保數據操作的原子性,從而直接在Eden空間分配內存。

4 對象分配過程示意圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章