上篇文章,我們說到自己寫的java程式碼檔案是怎麼打包到機器執行的過程。裡面提到了一個核心的元件叫類載入器,今天就來看看一個類從載入到使用的全過程都發生了什麼。
類從載入到使用的過程
1、載入
JVM透過類載入器把。class位元組碼檔案對應的類載入到記憶體,在載入階段會在記憶體中生成一個代表這個類的java。lang。Class物件,作為方法區這個類的各種資料的訪問入口
2、驗證
驗證載入進來的。calss位元組碼檔案是否符合指定Java虛擬機器規範
3、準備
分配類的記憶體空間
給類的類變數(static修飾的變數)分配記憶體空間,並賦予預設值,比如static修飾的int變數,預設值為0
4、解析
將符號引用替換成直接引用。這句話裡符號引用不好理解,什麼意思呢?
符號引用
:一組符號來描述引用的目標。符號引用可以是任何形式的字面量,只要使用時能無歧義的定位目標即可。
個人理解
:在編譯的時候每個Java類編譯成。class檔案,Java虛擬機器並不知道引用類的地址,就先用符號引用來代替,在解析階段,再替換成準備階段分配的記憶體真正地址
5、初始化
對類的靜態變數初始化為指定的值
執行靜態程式碼塊
舉個例子來加深理解
假如有下面這段程式碼
當我們執行Main方法啟動程式時,首先就會透過類載入器將主類Math載入到記憶體,看下圖
類被載入到方法區中主要包含哪些資訊
JVM裡存放類的資訊區域叫方法區(低版本jdk叫永久代)高版本jdk8以後叫metaspce元資料區。那麼類被載入到方法區之後,方法區中主要包含哪些資訊呢?以上面Math為例
執行時常量池
型別資訊
欄位資訊
方法資訊
類載入例項的引用
對應class物件例項的引用
上面載入哪一步有說過,類被載入到記憶體時,會建立一個程式碼這個類的java。lang。Class物件的例項放在堆中,作為開放人員訪問這個方法區類定義入口和切入點。