jvm中類的裝載是由類載入器(classloader)和它的子類來實現的,j**a中的類載入器是乙個重要的j**a執行時系統元件,它負責在執行時查詢和裝入類檔案中的類。
由於j**a的跨平台性,經過編譯的j**a源程式並不是乙個可執行程式,而是乙個或多個類檔案。當j**a程式需要使用某個類時,jvm會確保這個類已經被載入、連線(驗證、準備和解析)和初始化。
1.類的載入是指把類的.class檔案中的資料讀入到記憶體中,通常是建立乙個位元組陣列讀入.class檔案,然後產生與所載入類對應的class物件。載入完成後,class物件還不完整,所以此時的類還不可用。
2.當類被載入後就進入連線階段,這一階段包括驗證、準備(為靜態變數分配記憶體並設定預設的初始值)和解析(將符號引用替換為直接引用)三個步驟。
3.最後jvm對類進行初始化,包括:1)如果類存在直接的父類並且這個類還沒有被初始化,那麼就先初始化父類;
2)如果類中存在初始化語句,就依次執行這些初始化語句。
類的載入是由類載入器完成的,類載入器包括:根載入器(bootstrap)、擴充套件載入器(extension)、系統載入器(system)和使用者自定義類載入器(j**a.lang.classloader的子類)。從j**a 2(jdk 1.2)開始,類載入過程採取了父親委託機制(pdm)。pdm更好的保證了j**a平台的安全性,在該機制中,jvm自帶的bootstrap是根載入器,其他的載入器都有且僅有乙個父類載入器。類的載入首先請求父類載入器載入,父類載入器無能為力時才由其子類載入器自行載入。jvm不會向j**a程式提供對bootstrap的引用。下面是關於幾個類載入器的說明:
bootstrap:一般用本地**實現,負責載入jvm基礎核心類庫(rt.jar);
extension:從j**a.ext.dirs系統屬性所指定的目錄中載入類庫,它的父載入器是bootstrap;
system:又叫應用類載入器,其父類是extension。它是應用最廣泛的類載入器。它從環境變數classpath或者系統屬性j**a.class.path所指定的目錄中記載類,是使用者自定義載入器的預設父載入器。class a public a() }class b extends apublic b() }public class hello }
答:執行結果:1a2b2b。建立物件時構造器的呼叫順序是:先初始化靜態成員,然後呼叫父類構造器,再初始化非靜態成員,最後呼叫自身構器。
JVM載入class原理
當j a編譯器編譯好.class檔案之後,我們需要使用jvm來執行這個class檔案。那麼最開始的工作就是要把位元組碼從磁碟輸入到記憶體中,這個過程我們叫做 載入 載入完成之後,我們就可以進行一系列的執行前準備工作了,比如 為類靜態變數開闢空間,將常量池存放在方法區記憶體中並實現常量池位址解析,初始...
JVM之Class檔案結構
但是乙個類或者介面不一定生成class檔案,classloader直接生成。各個資料項按照嚴格的順序排列在class檔案中,沒有任何分隔符,當遇到需要占用8位位元組以上的資料項時,則會按照高位在前 或低位在前 方式分割為若干個8位位元組儲存。big endian little endian。clas...
jvm原理 簡單的程式載入分析
package com.bzu.csh 類載入器載入.class檔案 初始化static宣告,並不賦值 呼叫類 static宣告賦值由上到下 程式開始執行,首先執行main方法,執行main方法第一條語句,呼叫singleton類的靜態方法,這裡呼叫singleton類的靜態方法就是主動使用sing...