談起java語言,不得不說的就是jvm虛擬機。主要由于jvm實現了“平臺無關性”。編譯后的java程序指令并不能直接在硬件系統CPU上執行,而是由JVM執行。JVM屏蔽了與具體平臺相關的信息,使得java語言編譯程序只需要生成在JVM上運行的目標字節碼(.class),就可以在多種平臺上不加修改地運行。java虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。因此jvm是java程序能在多平臺進行無縫移植的可靠保證,同時jvm也是java程序安全檢查的檢測引擎。
圖片摘自javapapers網站:http://javapapers.com
ClassLoader Subsystem,加載器子系統 專用來加載.class文件,注意只載入需要的類文件到JVM中的運行時數據區域中,但不負責類的執行與否
Runtime Data Area,運行時數據區 提供程序運行時所需要的數據,包含方法區、堆、java棧、PC寄存器、本地方法棧
Execution Engine,執行引擎 包含兩部分:JIT和GC,而JIT用于執行字節碼,或執行本地方法;執行過程采用的是自定義的一套指令系統。GC則用于堆內存空間的回收管理。
Native Method Interface和Library,本地方法接口和本地方法庫
類加載器是一個用來加載類文件的類,名為ClassLoader。java源代碼通過javac編譯器編譯成class文件,然后由jvm的執行引擎來負責程序實行。那么類加載器負責加載文件系統、網絡或其他來源的類文件,默認有三種類加載器:Bootstrap類加載器、Extension類加載器和System類加載器(也叫APPClassLoader)。
Bootstrap類加載器:也稱為初始類加載器。對應JRE/lib/rt.jar PS:負責加載rt.jar中的JDK類文件,它是所有類加載器的父加載器。Bootstrap類加載器沒有任何父類加載器,如果你調用String.class.getClassLoader(),會返回null,任何基于此的代碼會拋出NUllPointerException異常。
Extension類加載器:對應JRE/lib/ext或java.ext.dirs指向的目錄。 PS:負責將加載類的請求先委托給它的父加載器,也就是Bootstrap,如果沒有成功加載的話,再從jre/lib/ext目錄下或者java.ext.dirs系統屬性定義的目錄下加載類。Extension加載器由sun.misc.Launcher$ExtClassLoader實現。
APPClassLoader類加載器:對應ClassPath環境變量,或由-classpath或-cp選項定義,或者是JAR中的Manifest的classpath屬性定義. PS:其負責從classpath環境變量中加載某些應用相關的類,classpath環境變量通常由-classpath或-cp命令行選項來定義,或者是JAR中的Manifest的classpath屬性。application類加載器是Extension類加載器的子加載器。通過sun.misc.Launcher$AppClassLoader實現。
用戶自定義類加載器:該加載器是留給程序員拓展用的,主要實現是通過java.lang.ClassLoader來繼承實現的
PS:該部分此處不詳細展開,后續會單獨專題來做深入的學習和探討
新聞熱點
疑難解答