JVM 之 Class檔案Load到記憶體的過程

2021-09-29 17:30:09 字數 1445 閱讀 1666

loading 到記憶體

linking

verification (驗證class檔案,「cafe babe」)

preperation (class靜態變數賦預設值 int->0 object->null)

resolution

initializing (靜態變數賦初始值)

的方法進行載入class檔案

雙親委派

即:classload載入class檔案,首先先向上詢問自己的父載入器(不是父類,是classload裡的parent屬性)是否已載入此class檔案(類似於快取,用乙個set來儲存已載入的class),一直詢問到最上層的classload,如果有則返回;如果沒有,則呼叫自己的loadclass方法進行載入,若無法載入,則向下讓子載入器呼叫loadclass載入,一直到最後一層若還妹有載入,丟擲classnotfount異常。

雙親委派由loadclass方法實現

原始碼如下:

在這裡插入**片
整合 classload類,重寫findclass方法

public

class

myclassload

extends

classloader

byte

data = bos.

tobytearray()

; fis.

close()

; bos.

close()

;// 呼叫defineclass 把 class載入到記憶體

return

defineclass

(name,data,

0,data.length);}

catch

(exception e)

return null;

}}

在findclass方法裡呼叫defineclass

測試結果

自定義classloader如何指定parent

檢視原始碼可知,只需要重寫建構函式,在重寫的建構函式中呼叫super(parent)即可指定

原始碼如下:

在這裡插入**片
使用的設計模式:模板方法(鉤子函式)

雙親委派的作用

快取的作用:防止重複載入class

如tomcat的熱載入機制,重寫了loadclass方法。

JVM之Class檔案結構

但是乙個類或者介面不一定生成class檔案,classloader直接生成。各個資料項按照嚴格的順序排列在class檔案中,沒有任何分隔符,當遇到需要占用8位位元組以上的資料項時,則會按照高位在前 或低位在前 方式分割為若干個8位位元組儲存。big endian little endian。clas...

JVM載入class檔案的原理機制?

jvm中類的裝載是由類載入器 classloader 和它的子類來實現的,j a中的類載入器是乙個重要的j a執行時系統元件,它負責在執行時查詢和裝入類檔案中的類。由於j a的跨平台性,經過編譯的j a源程式並不是乙個可執行程式,而是乙個或多個類檔案。當j a程式需要使用某個類時,jvm會確保這個類...

JVM載入class原理

當j a編譯器編譯好.class檔案之後,我們需要使用jvm來執行這個class檔案。那麼最開始的工作就是要把位元組碼從磁碟輸入到記憶體中,這個過程我們叫做 載入 載入完成之後,我們就可以進行一系列的執行前準備工作了,比如 為類靜態變數開闢空間,將常量池存放在方法區記憶體中並實現常量池位址解析,初始...