Java的JVM虛擬機器
1.JVM就是Java的OS,Java是通過JVM來訪問硬體的(其實JVM首先訪問底層OS,例如linux的功能,透過底層OS來訪問硬體); 2.JVM概覽
3.Class Loader將class載入到Runtime Data Areas,Execution Engine會完成Byte Code的解釋或者編譯,最終轉換為機器碼執行; 4.Java在預設情況下是對位元組碼邊解釋邊執行,所以會比較慢,因此後來的JVM推出來HotSpot功能,用的熱點程式碼直接變異把虛擬機器認為的經常使用的熱點程式碼直接編譯成本地的OS的二進位制,這樣以後再次使用的時候就直接使用本地的二進位制程式碼去執行,不用再次解釋就能執行; 5.Class Loader(類載入器):其實由BootStrap Class Loader、Extension Class Loader,System class Loader,User-Define class Loader等四種類記載器;
BootStrap Class Loader(啟動類載入器): 啟動類載入器主要載入的是JVM自身需要的類,這個類載入使用C++語言實現的,是虛擬機器自身的一部分,它負責將 <JAVA_HOME>/lib路徑下的核心類庫或-Xbootclasspath引數指定的路徑下的jar包載入到記憶體中,注意必由於虛擬機器是按照檔名識別載入jar包的,如rt.jar,如果檔名不被虛擬機器識別,即使把jar包丟到lib目錄下也是沒有作用的(出於安全考慮,Bootstrap啟動類載入器只加載包名為java、javax、sun等開頭的類)。
Extension Class Loader(擴充套件類載入器): 擴充套件類載入器是指Sun公司(已被Oracle收購)實現的sun.misc.Launcher$ExtClassLoader類,由Java語言實現的,是Launcher的靜態內部類,它負責載入<JAVA_HOME>/lib/ext目錄下或者由系統變數-Djava.ext.dir指定位路徑中的類庫,開發者可以直接使用標準擴充套件類載入器。 System Class Loader(系統類載入器): 也稱應用程式載入器是指 Sun公司實現的sun.misc.Launcher$AppClassLoader。它負責載入系統類路徑java -classpath或-D java.class.path 指定路徑下的類庫,也就是我們經常用到的classpath路徑,開發者可以直接使用系統類載入器,一般情況下該類載入是程式中預設的類載入器,通過ClassLoader#getSystemClassLoader()方法可以獲取到該類載入器。
6.類的查詢是自底向上,而類的載入是自頂向上;類載入器是系統優先; 7.下層的類載入器可以看見上層的類載入器,當時上層的類載入器無法看到下層的類載入器的類; 8.類載入器可以載入類,但是不可以解除安裝類, 9.loading->Linking->Initializing ,其中linking中包含Verifying:檢查類是否符合Java檔案規範和JVM規範; Preparing:分配所需要的記憶體以及屬性、方法所需要的資料結構; Resovlving:常量池中符號引用改為直接引用; Inatializing:主要是初始化類的區域性變數併為類的靜態變數且執行靜態程式碼塊; 10.類載入的方法: Class.forName:使用當前類的載入器載入類 Thread.currentThread.getContextClassLoader(): 11.在整個程式執行的時候資料區域有兩塊:一個是執行緒本地的資料區,另外一個是全域性共享的資料區域(Heap、Method Area、Runtime Constant Pool )
12.GC(詳細參考:Java GC介紹)