JVM內存分配

內存規整

堆中的內存空間是不是規整的(連續的),由JVM垃圾收集器所採用的垃圾回收算法決定,若是垃圾回收算法是帶有壓縮算法的,則爲連續的、規整的,若是垃圾回收算法是標記-清除算法(例如CMS收集器),則內存是不連續的、不規整的。
內存空間規整與否,決定這內存的分配方式。算法

內存分配方式

指針碰撞

內存空間是規整的,連續的內存中,一邊是已分配的內存空間,一邊是還沒有分配的內存空間,兩部分空間的中間有一個指針,經過移動指針的方式,來完成新對象實例的內存分配,這種分配方式叫指針碰撞法。併發

空閒列表

內存是不規整的,只能找一塊足夠大的空間,分配給對象實例,這種分配方式叫空閒列表法。線程

併發指針碰撞問題

同一塊內存區域執行指針碰撞,會有併發問題,解決辦法是:
一、爲分配內存空間的動做進行同步加鎖處理。
二、使用本地線程分配緩衝(TLAB,即Thread Local Allowcation Buffer)。指針

TLAB

爲每一個線程在堆中預先分配一小塊內存TLAB,線程在各自的TLAB上爲本身的實例對象分配內存空間。
當TLAB使用完時,加同步鎖,而後分配新的TLAB。對象

相關文章
相關標籤/搜索