JVM虛擬機概括

JVM大概分佈

總體上來說,JVM在劃分部分的時候可以按照對文件的操作流程分爲:類加載子系統,運行時數據區和執行引擎這三部分。(其次還有本地方法接口和本地方法庫)。

類加載子系統:

   首先java源文件就是.java,通過前端編譯器將其編譯成.class文件(java字節碼文件),類加載器就是讀取字節碼文件,然後把它轉化成java.lang.Class類的一個實例(與代碼中的實例不同)。每一個實例被加載的時候都會以"類名全程$加載器名"的形式作爲標記。

類加載器的分類:當JVM啓動時,會形成由三個類加載器組成的初始類加載器層次結構。

   引用(啓動)類加載器BootStrapClassLoader:其底層是用C/C++實現的所以內部的詳細情況無法在Java的層面來探知,因此它是所有類加載器的終極父類但是又在Java中不可見。主要是實現了對java核心庫文件的加載。主要加載的是JAVA_HOME/lib下的類庫。此類加載器無法被應用程序直接使用。

   拓展類加載器ExtensionClassLoader:負責加載JAVA_HOME/lib/ext目錄下的所有類庫。其是Lancher的內部類,也是ClassLoader的子類。父類加載器是引用類加載器,但是在Java層面無法探知。

   系統類加載器AppClassLoader:負責加載程序classpath下所有的jar和class文件,其父類是ExtensionClassLoader。

類加載中的雙親委派機制:

   如果一個類加載器收到了一個類加載請求,他不會立刻執行加載命令,而是將請求向其父類的類加載器委託並查看是否符合自己的加載範圍,同時查看是否是自己已經加載過的類,直至頂級的引用類加載器爲止,如果所有父類都無法加載此請求,就將請求拿回自己執行類加載。

   其在源碼中的解讀如下:先檢查是否已經被加載,沒有加載就調用父類加載器的loadClass方法,如果父類加載器不存在,則使用啓動類加載器。如果父類加載器加載失敗,就會拋出異常,在調用自己的findClass方法進行加載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章