JVM類加載器工作流程


  類加載器

  classloader:談到類加載,不得不提的就是負責此項工作的類加載器classloader,classloader的職責是將Java源文件編譯后的字節碼文件加載到內存中去執行。

  類加載至卸載過程

  

  步驟一、類加載機制

  當系統運行時,類加載器將.class文件的二進制數據從外部存儲器(如光盤,硬盤)調入內存中,CPU再從內存中讀取指令和數據進行運算,並將運算結果存入內存中。內存在該過程中充當着"二傳手"的作用,通俗的講,如果沒有內存,類加載器從外部存儲設備調入.class文件二進制數據直接給CPU處理,而由於CPU的處理速度遠遠大於調入數據的速度,容易造成數據的脫節,所以需要內存起緩沖作用。

  類將.class文件加載至運行時的方法區后,會在堆中創建一個Java.lang.Class對象,用來封裝類位於方法區內的數據結構,該Class對象是在加載類的過程中創建的,每個類都對應有一個Class類型的對象,Class類的構造方法是私有的,只有JVM能夠創建。因此Class對象是反射的入口,使用該對象就可以獲得目標類所關聯的.class文件中具體的數據結構。

  類加載的最終產物就是位於堆中的Class對象(注意不是目標類對象),該對象封裝了類在方法區中的數據結構,並且向用戶提供了訪問方法區數據結構的接口,即Java反射的接口。

  步驟二、連接過程

  (1)驗證:確保被加載類的正確性,即確保被加載的類符合javac編譯的規范

  (2)准備:為類的靜態變量分配內存,並初始化為默認值

  (3)解析:將類中的符號引用轉化為直接引用

   注:符號引用即一個Java源文件在被編譯時,在不清楚被引用類實際內存地址的情況下,會使用能唯一識別並定位到目標的符號來代替。如A類引用了B類,編譯時A並不知道B類實際的內存地址,故可以使用能唯一識別B的符號來代替。而當類加載時,編譯后的.class文件實際已被調入內存,可知道A,B類的實際內存地址,當引用的目標已被加載入內存,則此時的引用為直接引用。

  步驟三、初始化

  初始化過程為類的靜態變量賦予正確的初始值(與連接過程的准備階段不同,如int類型的靜態變量,JVM的默認值為0,遇到static int a = 3的代碼時,准備階段首先是賦值為0,初始化階段才賦值為3)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM