Java虛擬機JVM學習07 類的卸載機制

 

Java虛擬機JVM學習07 類的卸載機制

 

類的生命週期

  當Sample類被加載、鏈接和初始化後,它的生命週期就開始了。學習

  當表明Sample類的Class對象再也不被引用,即不可觸及時,Class對象就會結束生命週期,Sample類在方法區內的數據也會被卸載,從而結束Sample類的生命週期。spa

  因而可知,一個類什麼時候結束生命週期,取決於表明它的Class對象什麼時候結束生命週期3d

 

引用關係

  加載器和Class對象:視頻

  在類加載器的內部實現中,用一個Java集合來存放所加載類的引用。對象

  另外一方面,一個Class對象老是會引用它的類加載器。調用Class對象的getClassLoader()方法,就能得到它的類加載器。blog

  因而可知,Class實例和加載它的加載器之間爲雙向關聯關係教程

 

  類、類的Class對象、類的實例對象:生命週期

  一個類的實例老是引用表明這個類的Class對象。get

  在Object類中定義了getClass()方法,這個方法返回表明對象所屬類的Class對象的引用。虛擬機

  此外,全部的Java類都有一個靜態屬性class,它引用表明這個類的Class對象。

 

類的卸載

  由Java虛擬機自帶的類加載器所加載的類,在虛擬機的生命週期中,始終不會被卸載。

  前面介紹過,Java虛擬機自帶的類加載器包括根類加載器擴展類加載器系統類加載器

  Java虛擬機自己會始終引用這些類加載器,而這些類加載器則會始終引用它們所加載的類的Class對象,所以這些Class對象始終是可觸及的

 

  由用戶自定義的類加載器加載的類是能夠被卸載的。

 

具體例子

 

 

  loader1變量和obj變量間接應用表明Sample類的Class對象,而objClass變量則直接引用它。

 

  若是程序運行過程當中,將上圖左側三個引用變量都置爲null,此時Sample對象結束生命週期,MyClassLoader對象結束生命週期,表明Sample類的Class對象也結束生命週期,Sample類在方法區內的二進制數據被卸載

 

  當再次有須要時,會檢查Sample類的Class對象是否存在,若是存在會直接使用,再也不從新加載;若是不存在Sample類會被從新加載,在Java虛擬機的堆區會生成一個新的表明Sample類的Class實例(能夠經過哈希碼查看是不是同一個實例)。

 

參考資料

  聖思園張龍老師Java SE視頻教程。

相關文章
相關標籤/搜索