java對象的加載過程


1檢測類是否被加載

虛擬機遇到對象的創建

首先將去檢查這個指令的參數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已被加載、解析和初始化過(類的加載過程)

如果沒有,那必須先執行相應的類加載過程。

2為新生對象分配內存

通過計算對屬性計算在堆中分配空間。空間大小固定且不再更改。

由對象頭,對象數據,補位碼(每個對象位數都是8的倍數,不夠的需要有補位碼補位)三部分組成。

 

補充:

空間規整的情況下,在堆中使用指針碰撞

空間不規整的情況下,維護空閑列表,記錄每一塊的大小。使用空閑列表。

空間是否規整取決於垃圾回收器(GC的回收算法)

 

3初始化零值

將對象中所有非static屬性賦予初值。

避免構造函數沒有對所有屬性進行賦值。

4進行必要的設置

虛擬機要對對象進行必要的設置,例如這個對象是哪個類的實例、如何才能找到類的元數據信息、對象的哈希碼、對象的GC分代年齡等信息。這些信息存放在對象的對象頭之中。

5執行init方法

執行構造函數,對對象屬性進行賦值。

 

補充:

方法的調用/調用

創建一個虛函數表(指針數組)(堆中/還是常量池),其中的指針指向某個類的具體成員函數實現。為每一個類創建一個虛函數表的實例,並在每個對象中保存一個指向虛函數表的指針。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM