這是很重要的一門學問,剛好我昨天寫了篇文章,樓主可以物色物色。
Java中的類載入機制是java技術體系中算是比較核心的一部分,儘管我們平時接觸的並不是很多,而且類載入器也並不是和大部分軟體開發工作人員經常打交道的。但是我們在這裡學習Java的累加器的背後的機制,能夠幫助我們理解並有助於排查程式中出現的類載入失敗等技術問題,就好比上篇文章的放射,學習了這些,你回頭看的時候就很容易理解啦。
為什麼使用類載入
在我們學習的Java語言面裡,類載入是當我們的程式執行的時候完成的,這樣的方式儘管會給類載入時候的主機稍微的新增點點的效能開銷以外,就是能給java程式提供高度的靈活性。
我們在完成編寫以.java為字尾的檔案後,這些.java檔案就會透過java中的編譯器編譯成字尾名字是.class的檔案。我們走進.class檔案之後,我們就可以看到這裡面儲存著java程式碼在編譯轉換後的虛擬指令。
當我們準備使用這個類的時候,jvm虛擬就就會載入它的.class檔案,並且建立對應的.class物件,我們將這種class檔案載入到jvm虛擬機器的記憶體的這個過程稱之為類載入。
Loading(載入):載入就是我們把類的資訊從檔案中取得之後,再載入到JVM虛擬機器的方法區/常量區裡,也就是記憶體裡面。
Verifying(驗證):在這行模組我們會校驗載入的結構是不是符合Java語言規範和JVM規範的描述。在這個過程中,是類轉載的中最繁雜的一塊,在時間上的花費也是最長的一塊。我們使用的排錯程式,有一大部分也是在檢查這一部分的錯誤。
Preparing(準備):檢驗透過之後,我們會分配一種結構去儲存類的資訊,我們在這個結構中儲存了我們在類中定義的成員變數,方法和介面的資料資訊。
Resolving(解析):解析就是我們把這個類中常量池中的所有的 符號引用 改變成 直接引用。
Initializing(初始化):解析完成,我們就可以提取類中的變數,並且使之初始化成為合適的值。執行靜態的初始化程式,可以把靜態變數初始化成指定的數值
在這裡我們對載入要重點掌握,其餘的過程至於要了解即可。
相對於其他階段,載入階段,也就是說獲取類的2進位制的位元組流的這個階段,是我們在程式開發期可控性最強的一個階段。原因是,載入階段可以用我們系統提供的類載入器(ClassLoader)去獲取類的2進位制的位元組流,當然這個也可以由我們自定義的類載入器去獲取我們要的位元組流。
當我們的載入完成之後,jvm虛擬機器外部的2進位制位元組流就會按照jvm所需要的格式儲存在方法區中,其中的資料儲存格式都是由jvm自行定義實現。然後在Java的堆中例項化一個java.lang.Class類的物件,這個物件就是我們程式訪問方法區中的資料的外部介面。
世界很大,幸好有你~
這是很重要的一門學問,剛好我昨天寫了篇文章,樓主可以物色物色。
Java類載入機制Java中的類載入機制是java技術體系中算是比較核心的一部分,儘管我們平時接觸的並不是很多,而且類載入器也並不是和大部分軟體開發工作人員經常打交道的。但是我們在這裡學習Java的累加器的背後的機制,能夠幫助我們理解並有助於排查程式中出現的類載入失敗等技術問題,就好比上篇文章的放射,學習了這些,你回頭看的時候就很容易理解啦。
為什麼使用類載入
在我們學習的Java語言面裡,類載入是當我們的程式執行的時候完成的,這樣的方式儘管會給類載入時候的主機稍微的新增點點的效能開銷以外,就是能給java程式提供高度的靈活性。
類載入的過程我們在完成編寫以.java為字尾的檔案後,這些.java檔案就會透過java中的編譯器編譯成字尾名字是.class的檔案。我們走進.class檔案之後,我們就可以看到這裡面儲存著java程式碼在編譯轉換後的虛擬指令。
當我們準備使用這個類的時候,jvm虛擬就就會載入它的.class檔案,並且建立對應的.class物件,我們將這種class檔案載入到jvm虛擬機器的記憶體的這個過程稱之為類載入。
Loading(載入):載入就是我們把類的資訊從檔案中取得之後,再載入到JVM虛擬機器的方法區/常量區裡,也就是記憶體裡面。
Verifying(驗證):在這行模組我們會校驗載入的結構是不是符合Java語言規範和JVM規範的描述。在這個過程中,是類轉載的中最繁雜的一塊,在時間上的花費也是最長的一塊。我們使用的排錯程式,有一大部分也是在檢查這一部分的錯誤。
Preparing(準備):檢驗透過之後,我們會分配一種結構去儲存類的資訊,我們在這個結構中儲存了我們在類中定義的成員變數,方法和介面的資料資訊。
Resolving(解析):解析就是我們把這個類中常量池中的所有的 符號引用 改變成 直接引用。
Initializing(初始化):解析完成,我們就可以提取類中的變數,並且使之初始化成為合適的值。執行靜態的初始化程式,可以把靜態變數初始化成指定的數值
在這裡我們對載入要重點掌握,其餘的過程至於要了解即可。
相對於其他階段,載入階段,也就是說獲取類的2進位制的位元組流的這個階段,是我們在程式開發期可控性最強的一個階段。原因是,載入階段可以用我們系統提供的類載入器(ClassLoader)去獲取類的2進位制的位元組流,當然這個也可以由我們自定義的類載入器去獲取我們要的位元組流。
當我們的載入完成之後,jvm虛擬機器外部的2進位制位元組流就會按照jvm所需要的格式儲存在方法區中,其中的資料儲存格式都是由jvm自行定義實現。然後在Java的堆中例項化一個java.lang.Class類的物件,這個物件就是我們程式訪問方法區中的資料的外部介面。
感謝堅持關注的朋友~世界很大,幸好有你~