Oracle官方定義的Java技術系統主要包括以下幾個部分:
Java程式設計語言
各種平台的Java虛擬機器
#Class檔案格式
Java API類函式庫
第三方Java類別庫
可以把Java程式設計語言、Java虛擬機器和Java API類別庫這三部分統稱為JDK(Java Development Kit),它是Java程式開發的最小環境。另外,Java API中的Java SE API子集和Java虛擬機器這兩部分統稱為JRE(Java Runtime Environment),它是Java程式運作的標準環境。
Java虛擬機之所以被稱為是「虛擬」的,就是因為它只是由一個規格來定義的抽象電腦.
很多同學可能認為Java虛擬機,就是一個虛擬機而已,它還有家族?或是認為Java虛擬機指的就是Oracle的HotSpot虛擬機。這裡來簡單介紹Java虛擬機家族,自從1996年Sun公司發布的JDK1.0中包含的Sun Classic VM到今天,出現和消亡了很多種虛擬機,我們這裡只簡單介紹目前存活的相對主流Java虛擬機。
HotSpot VM
Oracle JDK和OpenJDK中自帶的虛擬機,是最主流的和使用範圍最廣的Java虛擬機。介紹Java虛擬機器的技術文章,如果不做特殊說明,大部分都是介紹HotSpot VM的。 HotSpot VM並非是Sun公司開發的,而是由Longview Technologies這家小公司設計的,它在1997年被Sun公司收購,Sun公司又在2009年被Oracle收購。
J9 VM
J9 VM 是IBM開發的VM,目前是其主力發展的Java虛擬機器。 J9 VM的市場定位和HotSpot VM接近,它是一款設計上從服務端到桌面應用再到嵌入式都考慮到的多用途虛擬機,目前J9 VM的性能水平大致跟HotSpot VM是一個檔次的。
Zing VM
以Oracle的HotSpot VM為基礎,改善了許多會影響延遲的細節。最大的三個賣點是:
1.低延遲,「無暫停」的C4 GC,GC帶來的暫停可以控制在10ms以下的級別,支援的Java堆大小可以到1TB;
2.啟動後快速預熱功能。
3.可管理性:零開銷、可在生產環境全時開啟的、整合在JVM內的監控工具Zing Vision。
#當我們執行一個Java程式時,它的執行流程是怎麼樣的呢?如下圖所示。
從上圖可以看到Java虛擬機器與java語言沒有什麼必然聯繫,它只與特定的二進位檔案:Class檔案有關。
這裡所講的體系結構,是指的Java虛擬機的抽象行為,而不是具體的例如HotSpot VM的實現。依照Java虛擬機器規範,抽象的Java虛擬機器如下圖所示。
JVM = 類別載入器 classloader + 執行引擎 execution engine + 執行時間資料區域 runtime data area。 classloader 把硬碟上的class 檔案載入到JVM中的執行時間資料區域, 但是它不負責這個類別檔案能否執行,而這個是 執行引擎 負責的。
Java虛擬機抽象規範只是個概念,一般所說的Java虛擬機都是該規範的具體實現,這個實現可能 來自多個提供者,並存在於多個平台上。它可以完全用軟體實現,或以硬體和軟體結合的方式來實現。
一個執行階段的Java虛擬機器實例的天職是:負責執行一個java程式。 當啟動一個Java程式時,一個虛擬機器實例也就誕生了。當程式關閉退出,這個虛擬機器實例也就隨之消亡。如果在同一台電腦上同時執行三個Java程序,將會得到三個Java虛擬機器實例。每個Java程式都運行於它自己的Java虛擬機器實例中。
Java虛擬機器實例透過呼叫某個初始類別的main()方法來執行一個Java程式。而這個main()方法必須是共有的(public)、靜態的(static)、傳回值為void,並且接受一個字串陣列作為參數。任何擁有這樣一個main()方法的類別都可以作為Java程式運行的起點。
public class Test {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("Hello World"); } }
In the above example, the main() method in the initial class of the Java program will be used as the starting point of the initial thread of the program, and any other threads are started by this initial thread.
There are two kinds of threads inside the Java virtual machine: daemon threads and non-daemon threads. Daemon threads are usually used by the virtual machine itself, such as threads that perform garbage collection tasks. However, a Java program can also mark any thread it creates as a daemon thread. The initial thread in the Java program - the one that starts in main(), is a non-daemon thread.
As long as there are any non-daemon threads running, the Java program will continue to run. When all non-daemon threads in the program terminate, the virtual machine instance will automatically exit . If the security manager allows it, the program itself can also exit by calling the exit() method of the Runtime class or the System class.
以上是詳解Java虛擬機器概述的詳細內容。更多資訊請關注PHP中文網其他相關文章!