想要深入學習Java虛擬機器的知識,首先得看一看虛擬機器的組成組件。它有哪幾部分構成,各部分都有什麼作用與聯絡。我們都知道Java虛擬機器是類比了一台硬體電腦,可以想象成Java虛擬機器就是一台硬體電腦,它擁有記憶體、cpu、輸入/輸出、網卡等。下面這張圖片展示了虛擬機器的組成:
Java一推出,就打著跨平台的旗號。其原理就是將目標檔案編譯成Java位元組碼檔案,通過虛擬機器去解釋執行,最終會被編譯成目標系統對應的指令。比如Windows、Linux、Mac OS平台上都有SUN實現的虛擬機器,但是每個平台去解釋其位元組碼檔案時,位元組碼檔案都是一樣的,只是最終產生的底層機器指令不一樣。由此可見,Java跨平台是令人可笑的,但是這種思想卻是偉大的。這也是很多人抱怨Java語言效率低的問題源頭。
中,JVM主要包括兩個子系統和兩個組件。兩個子系統分別是CLASS LOADER(類裝載器)子系統和EXECUTION ENGINE(執行引擎)子系統。兩個組件分別是RUNTIME DATA AREA(運行時資料區域)和NATIVE INTERFACE(本地介面)組件。
CLASS LOADER子系統:這個可以想象成硬體電腦中的I/O裝置,根據給定的全限定名類名(如java.lang.Object)來裝載class檔案的內容到RUNTIME DATA AREA中的METHOD AREA(方法地區)。Java程式員可以繼承java.lang.ClassLoader類來寫自己的ClassLoader。
EXECUTION ENGINE子系統:這個可以想象成一台電腦的CPU,執行Java編譯後的.class檔案中的指令。JVM有很多種實現,如SUN公司的JDK、IBM的JDK、開源的opensdk、Android的dalvik虛擬機器。任何JVM的實現JDK核心都是EXECUTION ENGINE子系統,不同JDK的好壞主要就是取決於各自實現的EXECUTION ENGINE的好壞。
NATIVE INTERFACE組件:這個可以想象成電腦中的網卡,做過Android的可能知道JNI,本地介面組件就是允許Java去調用底層C、C++的一些實現,與本地的一些類庫去互動。當調用native方法的時候,就進入了一個全新的並且不再受Java虛擬機器限制的世界,所以也很容易出現JVM無法控制的native heap OutOfMemory。
RUNTIME DATA AREA組件:這個可以想象成電腦中的記憶體,也是我們常說的JVM記憶體,它通常分為5個部分:
1.METHOD AREA方法區:被裝載的Java類資訊,也就是位元組碼資訊存放於此;
2.JAVA STACK棧空間:用於存放每個啟動並執行Java線程的局部變數、運算元、中間結果、以及執行內容資訊(JDK5.0之前大小為256K,之後為1M);
3.NATIVE METHOD STACK本地方法棧:儲存本地方法進入地區地址;
4.HEAP堆空間:用來存放Java執行個體對象;
5.PROGRAM COUNTER REGISTER程式計數器:每一個Java線程都有它自己的PC寄存器,也是該線程啟動時建立的。PC寄存器的內容總是指向下一條將被執行指令的地址,這裡的地址可以是一個本地指標,也可以是在方法區中相對應於該方法起始指令的位移量;
以上5部分只有HEAP和METHOD AREA是被所有線程共用使用的;而其他三個都是以線程為粒度的,每個線程獨自擁有自己的部分。
轉載來源www.boobooke.com/bbs->J2EE專區->藍山作品—Java背後的秘密(匯總)