jvm如何載入一個類

小咖啡111發表於2019-05-15

 

  第一步:載入,雙親委派:啟動類載入器(jre/lib),系統擴充套件類載入器(ext/lib),應用類載入器(classpath),前者為c++編寫,所以系統載入器的parent為空,後面兩個類載入器都是透過啟動類載入器載入完成後才能使用。載入的過程就是查詢位元組流,可以透過網路,也可以自己在程式碼生成,也可以來源一個jar包。另外,同一個類,被不同的類載入器載入,那麼他們將不是同一個類,java中透過類載入器和類的名稱來界定唯一,所以我們可以在一個應用成存在多個同名的類的不同實現。


  第二步:連結:(驗證,準備,解析) 驗證主要是校驗位元組碼是否符合約束條件,一般在位元組碼注入的時候關注的比較多。準備:給靜態欄位分配記憶體,但是不會初始化,解析主要是為了將符號引用轉換為實際引用,可能會觸發方法中引用的類的載入。


  第三步:初始化,如果賦值的靜態變數是基礎型別或者字串並且是final的話,該欄位將被標記為常量池欄位,另外靜態變數的賦值和靜態程式碼塊,將被放在一個叫cinit的方法內被執行,為了保證cinit方法只會被執行一次,這個方法會加鎖,我們一般實現單例模式的時候為保證執行緒安全,會利用類的初始化上的鎖。 初始化只有在特定條件下才會被觸發,例如new 一個物件,反射被呼叫,靜態方法被呼叫等。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31560357/viewspace-2644417/,如需轉載,請註明出處,否則將追究法律責任。

相關文章