當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視頻教程。