對象的內存分配有兩種方式,一種是指針碰撞另一種是空閒列表的方式,堆是否規整由咱們垃圾回收器來決定的 ,若是垃圾回收帶有咱們的壓縮算法,那麼他會規整的分配咱們的對象。java
咱們內存分配爲規整的,每次分配依靠指針位移來分配對象,若是在多線程建立對象的狀況下是經過在CPU硬件層面上加鎖CAS鎖來保證數據安全,如圖下所示算法
堆內部有一個列表來存儲咱們堆中空閒的地方。咱們建立對象則去找列表中對應的空閒區域去建立咱們的對象。每一個線程建立對象,都會被分配必定的內存緩衝區,當緩衝區不夠的時候可能會出現多個線程以同一搶佔新的內存空間,這裏的搶佔也是基於CAS鎖實現,以下圖數組
指針碰撞有線程安全問題使用cas無鎖在CPU硬件層面家鎖緩存
空閒列表則採用咱們的本地線程分配緩存,線程佔滿則採用咱們的cas加鎖方式,再去分配本地緩存分配一部分區域。安全
自身運行時數據(Mark Word)
哈希值 gc分代年齡 鎖狀態標誌 線程持有的鎖
分代的好處是能夠更具不一樣的區域進行不一樣的回收算法
類型指針:當前對象指向那個class對象,對應調用的方法也是調用class對象中的方法
數組長度 只有數組纔會有這個值
主要存放屬性變量,包括父類屬性等。
使用數據填充,沒有實際的意義 HotStop 虛擬機指定對象大小必須是8個字節的整數倍。若是不是8個字節則,使用此進行填充
對象的訪問分爲句柄引用和直接指針引用多線程
棧指向到句柄池(保存咱們實例對象的地址),使用句柄池就不用改變變量指針應用。spa
直接指針引用速度會比較快。咱們的java虛擬機有關常見hotSopt的虛擬機採用的是直接指針引用線程