標籤:rac 代理技術 階段 strong ssl 訪問 調用 myeclips jar
虛擬機器把描述類的資料從Class檔案載入到記憶體,並對資料進行檢驗、轉換解析和初始化,最終形成了可以被虛擬機器直接使用的Java類型,這就是虛擬機器的類載入機制。在Java語言裡,類型的載入、串連和初始化過程都是在程式運行時期完成的。
類的生命週期:
類從被載入到虛擬機器記憶體中開始,到卸載出記憶體,它的整個生命週期包括:載入(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initiallization)、使用(Using)和卸載(Unloading)這7個階段。其中驗證、準備、解析3個部分統稱為串連(Linking),這七個階段的發生順序如:
有且只有以下四種情況必須立即對類進行”初始化”(稱為對一個類進行主動引用):
- 遇到new、getstatic、putstatic、invokestatic這四條位元組碼指令時(使用new執行個體化對象的時候、讀取或設定一個類的靜態欄位、調用一個類的靜態方法)。
- 使用java.lang.reflet包的方法對類進行反射調用的時候。
- 當初始化一個類的時候,如果發現其負類沒有進行過初始化,則需要先觸發其父類的初始化。
- 當虛擬機器啟動時,虛擬機器會初始化主類(包含main方法的那個類)。
類載入的過程
載入
載入是類載入的第一個階段。有兩種時機會觸發類載入:
1、預先載入。虛擬機器啟動時載入,載入的是JAVA_HOME/lib/下的rt.jar下的.class檔案,這個jar包裡面的內容是程式運行時非常常常用到的,像java.lang.*、java.util.*、java.io.*等等,因此隨著虛擬機器一起載入。要證明這一點很簡單,寫一個空的main函數,設定虛擬機器參數為"-XX:+TraceClassLoading"來擷取類載入資訊,運行一下:
1 [Opened E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar] 2 [Loaded java.lang.Object from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar] 3 [Loaded java.io.Serializable from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar] 4 [Loaded java.lang.Comparable from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar] 5 [Loaded java.lang.CharSequence from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar] 6 [Loaded java.lang.String from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar] 7 [Loaded java.lang.reflect.GenericDeclaration from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar] 8 [Loaded java.lang.reflect.Type from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar] 9 [Loaded java.lang.reflect.AnnotatedElement from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]10 [Loaded java.lang.Class from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]11 [Loaded java.lang.Cloneable from E:\MyEclipse10\Common\binary\com.sun.java.jdk.win32.x86_64_1.6.0.013\jre\lib\rt.jar]12 ...
2、運行時載入。虛擬機器在用到一個.class檔案的時候,會先去記憶體中查看一下這個.class檔案有沒有被載入,如果沒有就會按照類的全限定名來載入這個類。
載入時類載入過程的一個階段,在載入階段,虛擬機器需要完成以下3件事情:
(1)通過一個類的全限定名來擷取定義此類的二進位位元組流
(2)將這個位元組流所代表的靜態儲存結構轉化為方法區的運行時資料結構
(3)在記憶體中產生一個代表這個類的java.lang.Class對象,作為方法區這個類的各種資料的訪問入口。
虛擬機器規範對這三點的要求並不具體,因此虛擬機器實現與具體應用的靈活度都是相當大的。例如第一條,根本沒有指明二進位位元組流要從哪裡來、怎麼來,因此單單就這一條,就能變出許多花樣來:
· 從zip包中擷取,這就是以後jar、ear、war格式的基礎
· 從網路中擷取,典型應用就是Applet
· 運行時計算產生,典型應用就是動態代理技術
· 由其他檔案產生,典型應用就是JSP,即由JSP產生對應的.class檔案
· 從資料庫中讀取,這種情境比較少見
總而言之,在類載入整個過程中,這部分是對於開發人員來說可控性最強的一個階段。
載入階段完成後,虛擬機器外部的二進位位元組流就按照虛擬機器所需的格式儲存在方法區之中。然後再記憶體中執行個體化
Java虛擬機器-類載入