了解java虛擬機類加載機制?
這是很重要的一門學問,剛好我昨天寫了篇文章,樓主可以物色物色。
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類的對象,這個對象就是我們程序訪問方法區中的數據的外部接口。
這就是java中的類加載器,幫助到樓主的話,關注一下唄
感謝堅持關注的朋友~世界很大,幸好有你~
歡迎在評論區留下你的問題或困惑,我將每天與你分享我的觀點和心得。
聚焦最新科技咨訊,探尋未來智能領域,我是Mario女陶。