(一、二)垃圾回收機制。
根據各個不同公司,JVM垃圾回收機制會不同。 我們大都用sun公司的實例,下面我們以sun公司的JVM爲例 。
(1.0)判斷對象是否死亡算法。
1. 可達性分析算法。垃圾回收線程(查找)---->"根集"【就是當前運行的線程中,可以訪問的引用變量的集合】(eg:當前函數的參數和局部變量,當前類的成員變量等等)---->垃圾回收線程(查找"根集"的直接引用)--->組成的對象 結合(循環重複上述步驟)---->找到所有對象。
①根集遍歷可達到--->有效對象。
②根集遍歷不可達到--->失效對象(垃圾)。
【擴充:①引用計數算法②可達性分析算法】
(2.0)垃圾回收的算法。
1. 分代收集算法。 分爲①年老代【不常進行,CPU開銷大】②年輕代【經常進行,CPU開銷小】
【擴充:①標記-清楚算法。②複製算法③標記-整理算法④分代收集算法】
(三)類的加載過程。詳情請關注---: 類的加載過程詳解
雙親委派模型是什麼【JDK1.2之前沒有】(轉)?圖示:
首先,得知道一個概念:自定義加載器。(JVM規範 所有繼承了抽象類java.lang.ClassLoader的類加載器:定義爲自定義加載器)
【重寫其findClass()方法:】
方法 說明
getParent() 返回該類加載器的父類加載器。
loadClass(String name) 加載名稱爲 二進制名稱爲name 的類,返回的結果是 java.lang.Class 類的實例。
findClass(String name) 查找名稱爲 name 的類,返回的結果是 java.lang.Class 類的實例。
findLoadedClass(String name) 查找名稱爲 name 的已經被加載過的類,返回的結果是 java.lang.Class 類的實例。
resolveClass(Class<?> c) 鏈接指定的 Java 類
雙親委派過程:當一個類加載器收到類加載任務時,立即將任務委派給它的父類加載器去執行,直至委派給最頂層的啓動類加載器爲止。如果父類加載器無法加載委派給它的類時,將類加載任務退回給它的下一級加載器去執行;
除了啓動類加載器以外,每個類加載器擁有一個父類加載器,用戶的自定義類加載器的父類加載器是AppClassLoader;
雙親委派模型可以保證全限名指定的類,只被加載一次;
雙親委派模型不具有強制性約束,是Java設計者推薦的類加載器實現方式;
(四)有哪些類加載器。
1.0 啓動類加載器(Bootstrap ClassLoader):由C++語言實現,直接嵌在JVM內核上,JVM啓動它就啓動了。
負責:加載JAVA_HOME\lib目錄中並且能被虛擬機識別的類庫到JVM內存中,如果名稱不符合的類庫即使放在lib目錄中也不會被加載。該類加載器無法被Java程序直接引用。
2.0 拓展類加載器(Extension ClassLoader):該加載器主要是負責加載JAVA_HOME\lib\,該加載器可以被開發者直接使用。
3.0 應用程序類加載器(Application ClassLoader):該類加載器也稱爲系統類加載器,它負責加載用戶類路徑(Classpath)上所指定的類庫,開發者可以直接使用該類加載器,如果應用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載器。
【注意:】他們之間的關係: