1. 程式人生 > >jvm中對象的創建過程

jvm中對象的創建過程

期望 創建過程 初始 方式 內存 同步方法 記錄 指令 介紹

虛擬機遇到new指令時:

首先檢查方法區中是否加載了類信息,如果沒有加載,則先加載類信息

類加載後,為對象分配內存,大小在加載類信息時確定

如果對內存是規整的,即垃圾回收後整理內存碎片合並成一塊未使用的區域則分配內存就是將記錄內存位置的指針移動相應大小的一段距離(指針碰撞)

如果內存不規整,即垃圾回收後沒有整理內存碎片,那麽需要維護一個列表,記錄內存碎片大小,分配空間時選擇可用的一塊(空閑列表)

同時分配內存時存在線程安全問題,即分配對象a的內存,指針還沒有變化,對象b又用了該指針分配內存,解決這個問題有兩種方式

1.CAS(舊值C,期望值A,新值s,當A=C時說明C值沒有修改過,然後讓C=S 這種方法可能引發ABA問題)+失敗重試

2.把內存分配根據不同線程,將堆劃分為不同的空間(TLAB 本地線程分配緩沖),哪個線程分配內存,就在哪個線程的TLAB上劃分,當TLAB用完,分配新的TLAB時,采用同步方法

對象分配內存後設置頭信息(對象頭信息後面再做介紹)

頭信息設置完成後執行初始化方法,至此對象創建完成

jvm中對象的創建過程