【Java】類加載過程

JVM把class文件加載到內存,並對數據進行校驗、解析和初始化,最終造成JVM能夠直接使用的Java類型的過程。java

類加載的過程主要分爲三個部分:安全

  • 加載數據結構

  • 連接jvm

  • 初始化.net

而連接又能夠細分爲三個小部分:對象

  • 驗證blog

  • 準備繼承

  • 解析內存

一、加載

簡單來講,加載指的是把class字節碼文件從各個來源經過類加載器裝載入內存中。get

將class文件字節碼內容加載到內存中,並將這些靜態數據轉換成方法區中的運行時數據結構,在堆中生成一個表明這個類的java.lang.Class對象,做爲方法區類數據的訪問入口。

(2)連接 將java類的二進制代碼合併到jvm的運行狀態之中的過程

二、連接

2.1 驗證

確保加載的類信息符合jvm規範,沒有安全方面的問題。

  1. 對於文件格式的驗證,好比常量中是否有不被支持的常量?文件中是否有不規範的或者附加的其餘信息?
  2. 對於元數據的驗證,好比該類是否繼承了被final修飾的類?類中的字段,方法是否與父類衝突?是否出現了不合理的重載?
  3. 對於字節碼的驗證,保證程序語義的合理性,好比要保證類型轉換的合理性。
  4. 對於符號引用的驗證,好比校驗符號引用中經過全限定名是否可以找到對應的類?校驗符號引用中的訪問性(private,public等)是否可被當前類訪問?

2.2 準備 

正式爲類變量(static變量)分配內存並設置類變量初始值的階段,這些內存都將在方法區中進行分配。

特別須要注意,初值,不是代碼中具體寫的初始化的值,而是Java虛擬機根據不一樣變量類型的默認初始值。

好比8種基本類型的初值,默認爲0;引用類型的初值則爲null;常量的初值即爲代碼中設置的值,final static tmp = 456, 那麼該階段tmp的初值就是456

2.3 解析

虛擬機常量池內的符號引用替換爲直接引用的過程。

(好比String s ="aaa",轉化爲 s的地址指向「aaa」的地址)

(3)初始化

這個階段主要是對類變量初始化,是執行類構造器的過程。

換句話說,只對static修飾的變量或語句進行初始化。

若是初始化一個類的時候,其父類還沒有初始化,則優先初始化其父類。

若是同時包含多個靜態變量和靜態代碼塊,則按照自上而下的順序依次執行。

當訪問一個java類的靜態域時,只有真正聲明這個靜態變量的類纔會被初始化。

參考連接:http://www.javashuo.com/article/p-bywnjqun-eq.html

相關文章
相關標籤/搜索