虛擬機中new指令的秘密

程序員小迷 2024-05-01 11:58:21

1.檢查加載。

若該類之前還未被加載,則進行類加載過程。

類的加載、鏈接(驗證類文件格式、准備類的靜態變量、解析符號引用)和初始化(執行類的靜態初始化代碼和靜態字段賦值)是在首次使用該類時(如:創建類的實例、訪問類的靜態字段或調用類的靜態方法)由JVM的類加載器自動完成的。

若類未找到或安全檢查失敗,則會抛出NoClassDefFoundError或ClassNotFoundException異常。

2.分配內存。

查找類的元數據信息,並基于此,JVM在堆內存中分配足夠的內存空間來創建對象實例。

若堆內存不足,則會抛出OutOfMemoryError異常。

3.內存空間初始化。

內存空間會被初始化爲零值。

4.設置。

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

5.對象初始化。

執行類的構造函數(<init>方法)。

在HotSpot虛擬機中,對象在內存中存儲的布局可以分爲3塊區域:對象頭(Header)、實例數據(Instance Data)和對齊填充(Padding)。

對象頭包括2部分(若對象是數組,則爲3部分)信息:

1)第一部分爲Mark Word,用于存儲對象自身的運行時數據,如哈希碼(HashCode)、GC分代年齡、鎖狀態標志、線程持有的鎖、偏向線程ID、偏向時間戳等。

2)第二部分是類型指針,即對象指向它的所屬類的指針,虛擬機通過這個指針來確定這個對象實例所屬的類。

Sun HotSpot虛擬機是使用直接指針方式進行對象訪問的。

3)若對象是一個Java數組,則對象頭中還有一塊數據用于記錄數組的長度。

微風不燥,陽光正好,你就像風一樣經過這裏,願你停留的片刻溫暖舒心。

我是程序員小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等編程技術的技巧經驗分享),若作品對您有幫助,請關注、分享、點贊、收藏、在看、喜歡,您的支持是我們爲您提供幫助的最大動力。

歡迎關注。助您在編程路上越走越好!

0 阅读:2

程序員小迷

簡介:致力于Android、C等編程技術的技巧經驗分享