類加載機(jī)制[1]
Java 默認(rèn)提供的三個(gè) ClassLoader
BootStrap ClassLoader
稱為啟動(dòng)類加載器,是 Java 類加載層次中最頂層的類加載器,負(fù)責(zé)加載JDK中的核心類庫,如:rt.jar, resources.jar, charsets.jar 等
Extension ClassLoader
稱為擴(kuò)展類加載器,負(fù)責(zé)加載Java的擴(kuò)展類庫,默認(rèn)加載 JAVA_HOME/jre/lib/ext 目錄下的所有 jar
App ClassLoader
稱為系統(tǒng)類加載器,負(fù)責(zé)加載應(yīng)用程序 classpath 目錄下的所有 jar 和 class 文件
如果你需要從其他路徑,比如網(wǎng)絡(luò)上加載類的時(shí)候就需要實(shí)現(xiàn)自己的類加載器。類加載器的作用就是告訴虛擬機(jī)去哪里加載所需要的類。用了委派的設(shè)計(jì)模式。即便用自定義類去加載所類。它是向自己的上一級(jí)詢問這個(gè)類有沒有加載,逐級(jí)向上。如果都沒有加載。再由上到下嘗試去加載。如下圖:

內(nèi)存泄漏[2]
每個(gè)對(duì)象,都有一個(gè)對(duì)它的類的引用,object.getClass()
每個(gè)類對(duì)象,都有一個(gè)對(duì)它的 classLoader 的引用,object.getClass().getClassLoader()
同樣的每個(gè) classLoader 對(duì)它加載的類對(duì)象都有一個(gè)引用。如果某個(gè)對(duì)象發(fā)生了內(nèi)存泄漏,則它的類對(duì)象也不能被回收,加載類對(duì)象的 classLoader 也就不能被回收,根據(jù)垃圾回收的規(guī)則,該 classLoader 加載的類對(duì)象都不能被回收。