一、加載:查找並加載類的二進制數據,在加載階段,虛擬機須要完成如下三件事情java
一、經過一個類的全限定名來獲取其定義的二進制字節流數據結構
二、將這個字節流所表明的靜態存儲結構轉化爲方法區的運行時數據結構對象
三、在Java堆中生成一個表明這個類的java.lang.Class對象,做爲對方法區中這些數據的訪問入口接口
二、鏈接內存
一、驗證:確保被加載類的正確性虛擬機
二、準備:爲類的靜態變量分配內存,並將其初始化爲默認值變量
一、這個階段進行內存分配的僅包括類變量,而不包括實例變量,實例變量會在對象實例化時隨着對象一塊被分配在Java堆中數據類型
二、這裏所設的初始值一般狀況下是數據類型默認的零值,而不是被在Java代碼中被顯式地賦予的值引用
三、同時被static final修飾的變量,纔會在這個階段被賦值(程序中所設定的值)二進制
三、解析:把類中符號引用替換成直接引用
三、初始化
JVM初始化步驟:
一、假如這個類尚未被加載和鏈接,則程序先加載並鏈接該類
二、加入這個類的父類尚未被初始化,則先初始化其直接父類
三、假如類中有初始化語句,則系統依次執行這些初始化語句
JVM負責開始對類進行初始化,主要對類變量進行初始化,在Java中對類變量進行初始值設定有兩種方式:
一、聲明類變量時指定初始值
二、使用靜態代碼塊爲類變量指定初始值
類初始化時機:
一、建立類的實例,也就是new的方式
二、訪問某個類或接口的靜態變量,或者對該靜態變量賦值
三、調用類的靜態方法
四、反射,如Class.forName()
五、初始化某個類,其父類也會被初始化
六、Java虛擬機啓動時被標明爲啓動類的類(Java Test),直接使用java.exe命令來運行某個主類
四、使用
五、卸載