(一)Java虛擬機相關問題詳解

(一、二)垃圾回收機制。

   根據各個不同公司,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)上所指定的類庫,開發者可以直接使用該類加載器,如果應用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載器。

    【注意:】他們之間的關係:

 

發佈了52 篇原創文章 · 獲贊 76 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章