棧上分配與TLAB

大部分new出來的對象被分配在堆上,而不是所有。

  • 經過對Java對象分配的過程分析,能夠知道有另外兩個地方也是能夠存放對象的。

  • 這兩個地方分別棧 (涉及逃逸分析相關知識)和TLAB(Thread Local Allocation Buffer)。

棧上分配

  • 若是肯定一個對象的做用域不會逃逸出方法以外,
    • 那能夠將這個對象分配在棧上
    • 這樣,對象所佔用的內存空間就能夠隨棧幀出棧而銷燬。
  • 在通常應用中,不會逃逸的局部對象所佔的比例很大,
    • 若是能使用棧上分配,那大量的對象就會隨着方法的結束而自動銷燬了,
    • 無須經過垃圾收集器回收,能夠減少垃圾收集器的負載。
  • JVM容許將線程私有的對象打散分配在棧上,而不是分配在堆上。
    • 分配在棧上的好處是能夠在函數調用結束後自行銷燬,
    • 而不須要垃圾回收器的介入,從而提升系統性能。
  • 棧上分配的技術基礎: 
    • 一是逃逸分析:緩存

      • 逃逸分析的目的是判斷對象的做用域是否有可能逃逸出函數體。多線程

    • 二是標量替換:容許將對象打散分配在棧上,函數

      • 好比若一個對象擁有兩個字段,會將這兩個字段視做局部變量進行分配。性能

    • 只能在server模式下才能啓用逃逸分析,spa

      • 參數-XX:DoEscapeAnalysis啓用逃逸分析,線程

      • 參數-XX:+EliminateAllocations開啓標量替換(默認打開)。server

      • Java SE 6u23版本以後,HotSpot中默認就開啓了逃逸分析,對象

        • 能夠經過選項-XX:+PrintEscapeAnalysis查看逃逸分析的篩選結果。blog

TLAB

  • TLAB的全稱是Thread Local Allocation Buffer,
    • 即線程本地分配緩存區,
    • 這是一個線程專用的內存分配區域。 
  • JVM使用TLAB來避免多線程衝突,
    • 在給對象分配內存時,每一個線程使用本身的TLAB,
    • 這樣能夠避免線程同步,提升了對象分配的效率。 
  • TLAB自己佔用eEden區空間,
    • 在開啓TLAB的狀況下,虛擬機會爲每一個Java線程分配一塊TLAB空間
      • 參數-XX:+UseTLAB開啓TLAB,默認是開啓的。
    • TLAB空間的內存很是小,
      • 缺省狀況下僅佔有整個Eden空間的1%,
      • 固然能夠經過選項-XX:TLABWasteTargetPercent設置TLAB空間所佔用Eden空間的百分比大小。
  • 因爲TLAB空間通常不會很大,
    • 所以大對象沒法在TLAB上進行分配,老是會直接分配在堆上

​​​​​​​

相關文章
相關標籤/搜索