【JVM】類的加載過程

類的加載過程分爲加載、連接、初始化,而連接過程又分爲驗證、準備、解析。

加載

在加載過程,完成3件事情:1) 通過全類名獲取定義此類的二進制字節流;2) 將字節流代表的靜態存儲結構轉換爲方法區的運行時數據結構;3) 在內存中生成代表該類的class對象,作爲方法區這些數據的訪問入口。
非數組類的加載還可以通過自定義類加載器去控制字節流的獲取方式(重寫一個類加載器的loadClass()方法),數組類型不通過類加載器創建,而是JVM直接創建。

驗證

包括驗證class文件的魔數、版本號、符號引用合法性、是否繼承了final類、是否實現了抽象類或接口中的抽象方法等。

準備

給類變量(static修飾)分配內存並設置初始值,在方法區中分配。默認會給這些變量賦0值,對於常量則直接將常量值賦給它。
注意:static final修飾會賦給常量值,只有static修飾即使在程序中賦初始值了,準備階段後也是0,在初始化階段纔會賦初始值。

解析

將JVM常量池中的符號引用替換爲直接引用。
符號引用:以一組符號描述引用目標,符號可以是任何形式的字面量,只要使用時無歧義定位到目標即可。符號引用與JVM實現的內存佈局無關,不一定已加載到內存。
直接引用:直接指向目標的指針、相對偏移量或間接定位目標的句柄。與JVM實現內存佈局相關,目標必然已存在內存中。

初始化

執行類構造器方法,該方法根據代碼中的賦值動作、靜態語句塊合併產生,對類變量進行初始化。

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