Java new一個對象的過程

1,首先到常量池中找類的帶路徑全名,然後檢查對應的字節碼是否已被加載,解析,驗證,初始化,如果沒有先執行類加載過程(class.forname())。

2,類加載過程完成後,虛擬機會爲對象分配內存。分配內存有兩種方式,根據使用的垃圾收集器的不同使用不同的分配機制。

(1)指針碰撞,當虛擬機使用複製算法或標記整理算法實現的垃圾收集器時,內存區域都是規整的,這時候使用指針碰撞分配內存,用過的內存放在一邊,空閒的內存在另一邊,中間用一個指針作爲分界點,當需要爲新對象分配內存時只需把指針向空閒的一邊移動一段與對象大小相等的距離。

(2)空閒列表,當虛擬機使用標記清除算法實現的垃圾收集器時,內存都是碎片化的,那虛擬機就要記錄哪塊內存是可用的,當需要分配內存時,找一塊足夠大的內存空間給對象實例,並更新記錄。

3,設置對象頭信息,如所屬類,元數據信息,哈希碼,gc分代年齡,等等。

4,調用對象的init()方法,根據傳入的屬性值給對象屬性賦值。

5,在線程棧中新建對象引用,並指向堆中剛剛新建的對象實例。
————————————————
版權聲明:本文爲CSDN博主「石強@」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_32379477/article/details/90239891

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