首頁  >  文章  >  Java  >  JVM簡介

JVM簡介

一个新手
一个新手原創
2017-10-10 09:17:511799瀏覽

JVM介紹

1. 什麼是JVM?

JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是透過在實際的計算機上模擬模擬各種計算機功能來實現的。 Java虛擬機器包括一套字節碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個儲存方法域。 JVM屏蔽了與特定作業系統平台相關的訊息,使Java程式只需產生在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平台上不加修改地運行。 JVM執行字節碼時,實際上最後還是把字節碼解釋成具體平台上的機器指令執行。

Java語言的一個非常重要的特點就是與平台的無關性。而使用Java虛擬機器是實現此特性的關鍵。一般的高階語言如果要在不同的平台上執行,至少需要編譯成不同的目標程式碼。而引入Java語言虛擬機器後,Java語言在不同平台上執行時不需要重新編譯。 Java語言使用Java虛擬機器屏蔽了與特定平台相關的訊息,使得Java語言編譯程式只需產生在Java虛擬機器上運行的目標程式碼(字節碼),就可以在多種平台上不加修改地運行。 Java虛擬機執行字節碼時,把字節碼解釋成具體平台上的機器指令執行。這就是Java的能夠「一次編譯,到處運行」的原因。

2. JRE/JDK/JVM是什麼關係?

JRE(JavaRuntimeEnvironment,Java運行環境),也就是Java平台。所有的Java 程式都要在JRE下才能運作。一般使用者只需要執行已開發好的java程序,安裝JRE即可。

JDK(Java Development Kit)是程式開發者用來編譯、偵錯java程式用的開發工具包。 JDK的工具也是Java程序,也需要JRE才能運作。為了保持JDK的獨立性和完整性,在JDK的安裝過程中,JRE也是 安裝的一部分。所以,在JDK的安裝目錄下有一個名為jre的目錄,用來存放JRE檔。

JVM(JavaVirtualMachine,Java虛擬機)是JRE的一部分。它是一個虛構出來的計算機,是透過在實際的計算機上模擬模擬各種計算機功能來實現的。 JVM有自己完善的硬體架構,如處理器、堆疊、暫存器等,還具有對應的指令系統。 Java語言最重要的特色就是跨平台運行。使用JVM就是為了支援與作業系統無關,實現跨平台。

3. JVM原理

JVM是java的核心和基礎,在java編譯器和os平台之間的虛擬處理器。它是一種利用軟體方法實現的抽象的電腦基於下層的作業系統和硬體平台,可以在上面執行java的字節碼程式。

 java編譯器只要面對JVM,產生JVM能理解的程式碼或字節碼檔。 Java原始檔編譯成字節碼程序,透過JVM將每個指令翻譯成不同平台機器碼,透過特定平台運作。

 4. JVM執行程式的程序

#1) 載入.class檔案2) 管理並分配記憶體3) 執行垃圾收集

# #JRE(java執行環境)由JVM建構的java程式的運行環,也是Java程式運行的環境,但是他同時一個作業系統的一個應用程式一個進程,因此他也有他自己的運行的生命週期,也有自己的程式碼和資料空間。 JVM在整個jdk中處於最底層,負責於作業系統的交互,用來屏蔽作業系統環境,提供一個完整的Java運行環境,因此也就虛擬電腦。作業系統裝入JVM是透過jdk中Java.exe來完成,透過下方4步驟來完成JVM環境:1) 建立JVM裝載環境與設定2) 裝載JVM.dll 3) 初始化JVM.dll並掛界到JNIENV( JNI呼叫介面)實例4) 呼叫JNIEnv實例裝載並處理class類別。

 5. JVM的生命週期

1) JVM實例對應了一個獨立運行的java程式它是進程級別 
a) 啟動。啟動一個Java程式時,一個JVM實例就產生了,任何一個擁有public static void 
main(String[] args)函數的class都可以作為JVM實例運作的起點 
b) 運作。 main()作為該程式初始執行緒的起點,任何其他執行緒均由該執行緒啟動。 JVM內部有兩種線程:守護線程和非守護線程,main()屬於非守護線程,守護線程通常由JVM自己使用,java程式也可以顯示自己建立的線程是守護線程 
c) ​​消亡。當程式中的所有非守護執行緒都終止時,JVM才會退出;若安全管理器允許,程式也可以使用Runtime類別或System.exit()來退出

 2) JVM執行引擎實例則對應了屬於使用者執行程式的執行緒它是執行緒層級的

 6. JVM的體系結構

  • 類別裝載器(ClassLoader)(用來裝載.class檔案)

  • 執行引擎(執行字節碼,或執行本機方法)

  • 執行階段資料區(方法區、堆疊、java堆疊、PC暫存器、本機方法堆疊)

7. JVM運行時資料區

第一塊:PC暫存器

PC暫存器是用來儲存每個執行緒下一步將執行的JVM指令,如該方法為native的,則PC暫存器中不儲存任何資訊。

第二塊:JVM堆疊

JVM堆疊是線程私有的,每個執行緒建立的同時都會建立JVM棧,JVM棧中存放的為目前執行緒中局部基本類型的變數(java中定義的八種基本型別:boolean、char、byte、short、int、long、float、double)、部分的回傳結果以及Stack Frame,非基本型別的物件在JVM堆疊上僅存放一個指向堆上的位址。

第三塊:堆(Heap)

它是JVM用來儲存物件實例以及陣列值的區域,可以認為Java中所有透過new建立的對象的記憶體都在此分配,Heap中的物件的記憶體需要等待GC回收。

(1) 堆是JVM中所有執行緒共享的,因此在其上進行物件記憶體的分配均需要加鎖,這也導致了new物件的開銷是比較大的

(2) Sun Hotspot JVM為了提升物件記憶體分配的效率,對於所建立的執行緒都會分配一塊獨立的空間TLAB(Thread Local Allocation Buffer),其大小由JVM根據運行的情況計算而得,在TLAB上分配物件時不需要加鎖,因此JVM在給執行緒的物件分配記憶體時會盡量的在TLAB上分配,在這種情況下JVM中分配物件記憶體的效能和C基本上是一樣高效的,但如果對象過大的話則仍然是直接使用堆空間分配

(3) TLAB僅作用於新生代的Eden Space,因此在編寫Java程序時,通常多個小的對象比大的物件分配起來更有效率。

(4) 所有新建立的Object 都會儲存在新生代Yong Generation中。如果Young Generation的資料在一次或多次GC後存活下來,那麼將會被轉移到OldGeneration。新的Object總是創建在Eden Space。

第四塊:方法區域(Method Area)

(1)在Sun JDK中這塊區域對應的為PermanetGeneration,又稱為持久代。

(2)方法區域存放了所載入的類別的資訊(名稱、修飾符等)、類別中的靜態變數、類別中定義為final類型的常數、類別中的Field資訊、類別中的方法信息,當開發人員在程式中透過Class物件中的getName、isInterface等方法來獲取資訊時,這些資料都來自方法區域,同時方法區域也是全域共享的,在一定的條件下它也會被GC,當方法區域需要使用的記憶體超過其允許的大小時,就會拋出OutOfMemory的錯誤訊息。

第五塊:執行時間常數池(Runtime Constant Pool)

存放的為類別中的固定的常數資訊、方法和Field的引用資訊等,其空間從方法區域中分配。

第六個區塊:本機方法堆疊(Native Method Stacks)

JVM採用本機方法堆疊來支援native方法的執行,此區域用於儲存每個native方法呼叫的狀態。

8. JVM垃圾回收

GC (Garbage Collection)的基本原理:將記憶體中不再被使用的物件回收, GC中用於回收的方法稱為收集器,由於GC需要消耗一些資源和時間,Java在對物件的生命週期特徵進行分析後,按照新生代、舊生代的方式來對物件進行收集,以盡可能的縮短GC對應用造成的暫停

(1)對新生代的對象的收集稱為minor GC;

(2)對舊生代的對象的收集稱為Full GC;

(3)程式中主動呼叫System.gc()強制執行的GC為Full GC。

不同的物件參考類型, GC會採用不同的方法進行回收,JVM物件的參考分為了四種類型:

(1)強引用:預設情況下,物件採用的均為強引用(這個物件的實例沒有其他物件引用,GC時才會被回收)

(2)軟引用:軟引用是Java中提供的一種比較適合於快取場景的應用(只有在記憶體不夠用的情況下才會被GC)

(3)弱引用:在GC時一定會被GC回收

(4)虛引用:由於虛引用只是用來得知物件是否被GC

 

主要內容來自:http://baike.baidu.com/link? url=r1DppgYdvfVHc2I0uVBfCgYd0米78MJUrHq46ZS-8OsHDCMKkwmJTmXkPrkBZmbNqOA49iDyxsLIkm

1. 什麼是JVM?

JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是透過在實際的計算機上模擬模擬各種計算機功能來實現的。 Java虛擬機器包括一套字節碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個儲存方法域。 JVM屏蔽了與特定作業系統平台相關的訊息,使Java程式只需產生在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平台上不加修改地運行。 JVM執行字節碼時,實際上最後還是把字節碼解釋成具體平台上的機器指令執行。

Java語言的一個非常重要的特點就是與平台的無關性。而使用Java虛擬機器是實現此特性的關鍵。一般的高階語言如果要在不同的平台上執行,至少需要編譯成不同的目標程式碼。而引入Java語言虛擬機器後,Java語言在不同平台上執行時不需要重新編譯。 Java語言使用Java虛擬機器屏蔽了與特定平台相關的訊息,使得Java語言編譯程式只需產生在Java虛擬機器上運行的目標程式碼(字節碼),就可以在多種平台上不加修改地運行。 Java虛擬機執行字節碼時,把字節碼解釋成具體平台上的機器指令執行。這就是Java的能夠「一次編譯,到處運行」的原因。

2. JRE/JDK/JVM是什麼關係?

JRE(JavaRuntimeEnvironment,Java運行環境),也就是Java平台。所有的Java 程式都要在JRE下才能運作。一般使用者只需要執行已開發好的java程序,安裝JRE即可。

JDK(Java Development Kit)是程式開發者用來編譯、偵錯java程式用的開發工具包。 JDK的工具也是Java程序,也需要JRE才能運作。為了保持JDK的獨立性和完整性,在JDK的安裝過程中,JRE也是 安裝的一部分。所以,在JDK的安裝目錄下有一個名為jre的目錄,用來存放JRE檔。

JVM(JavaVirtualMachine,Java虛擬機)是JRE的一部分。它是一個虛構出來的計算機,是透過在實際的計算機上模擬模擬各種計算機功能來實現的。 JVM有自己完善的硬體架構,如處理器、堆疊、暫存器等,還具有對應的指令系統。 Java語言最重要的特色就是跨平台運行。使用JVM就是為了支援與作業系統無關,實現跨平台。

3. JVM原理

JVM是java的核心和基礎,在java編譯器和os平台之間的虛擬處理器。它是一種利用軟體方法實現的抽象的電腦基於下層的作業系統和硬體平台,可以在上面執行java的字節碼程式。

 

java編譯器只要是針對JVM,產生JVM能理解的程式碼或字節碼檔。 Java原始檔編譯成字節碼程序,透過JVM將每個指令翻譯成不同平台機器碼,透過特定平台運作。

 

4. JVM執行程式的程序

#1) 載入.class檔案2) 管理並分配記憶體3) 執行垃圾收集

JRE(java執行環境)由JVM建構的java程式的運行環,也是Java程式運行的環境,但是他同時一個作業系統的一個應用程式一個進程,因此他也有他自己的運行的生命週期,也有自己的程式碼和資料空間。 JVM在整個jdk中處於最底層,負責於作業系統的交互,用來屏蔽作業系統環境,提供一個完整的Java運行環境,因此也就虛擬電腦。作業系統裝入JVM是透過jdk中Java.exe來完成,透過下方4步驟來完成JVM環境:1) 建立JVM裝載環境與設定2) 裝載JVM.dll 3) 初始化JVM.dll並掛界到JNIENV( JNI呼叫介面)實例4) 呼叫JNIEnv實例裝載並處理class類別。

 

5. JVM的生命週期

#

1) JVM執行個體對應了一個獨立運作的java程式它是進程層級 
a) 啟動。啟動一個Java程式時,一個JVM實例就產生了,任何一個擁有public static void 
main(String[] args)函數的class都可以作為JVM實例運作的起點 
b) 運作。 main()作為該程式初始執行緒的起點,任何其他執行緒均由該執行緒啟動。 JVM內部有兩種線程:守護線程和非守護線程,main()屬於非守護線程,守護線程通常由JVM自己使用,java程式也可以顯示自己建立的線程是守護線程 
c) ​​消亡。當程式中的所有非守護執行緒都終止時,JVM才會退出;若安全管理器允許,程式也可以使用Runtime類別或System.exit()來退出

 

#2) JVM執行引擎實例則對應了屬於使用者執行程式的執行緒它是執行緒層級的

 

#6. JVM的體系結構

 


  • 類別載入器(ClassLoader)(用來載入.class檔案)

  • 執行引擎(執行字節碼,或執行本機方法)

  • 執行階段資料區(方法區、堆疊、java堆疊、PC暫存器、本機方法堆疊)

7.JVM執行階段資料區

第一塊:PC暫存器

PC暫存器是用來儲存每個執行緒下一步將執行的JVM指令,如該方法為native的,則PC暫存器中不儲存任何資訊。

第二塊:JVM堆疊

JVM堆疊是線程私有的,每個執行緒建立的同時都會建立JVM棧,JVM棧中存放的為目前執行緒中局部基本類型的變數(java中定義的八種基本型別:boolean、char、byte、short、int、long、float、double)、部分的回傳結果以及Stack Frame,非基本型別的物件在JVM堆疊上僅存放一個指向堆上的位址。

第三塊:堆(Heap)

它是JVM用來儲存物件實例以及陣列值的區域,可以認為Java中所有透過new建立的對象的記憶體都在此分配,Heap中的物件的記憶體需要等待GC回收。

(1) 堆是JVM中所有執行緒共享的,因此在其上進行物件記憶體的分配均需要加鎖,這也導致了new物件的開銷是比較大的

(2) Sun Hotspot JVM為了提升物件記憶體分配的效率,對於所建立的執行緒都會分配一塊獨立的空間TLAB(Thread Local Allocation Buffer),其大小由JVM根據運行的情況計算而得,在TLAB上分配物件時不需要加鎖,因此JVM在給執行緒的物件分配記憶體時會盡量的在TLAB上分配,在這種情況下JVM中分配物件記憶體的效能和C基本上是一樣高效的,但如果對象過大的話則仍然是直接使用堆空間分配

(3) TLAB僅作用於新生代的Eden Space,因此在編寫Java程序時,通常多個小的對象比大的物件分配起來更有效率。

(4) 所有新建立的Object 都會儲存在新生代Yong Generation中。如果Young Generation的資料在一次或多次GC後存活下來,那麼將會被轉移到OldGeneration。新的Object總是創建在Eden Space。

第四塊:方法區域(Method Area)

(1)在Sun JDK中這塊區域對應的為PermanetGeneration,又稱為持久代。

(2)方法區域存放了所載入的類別的資訊(名稱、修飾符等)、類別中的靜態變數、類別中定義為final類型的常數、類別中的Field資訊、類別中的方法信息,當開發人員在程式中透過Class物件中的getName、isInterface等方法來獲取資訊時,這些資料都來自方法區域,同時方法區域也是全域共享的,在一定的條件下它也會被GC,當方法區域需要使用的記憶體超過其允許的大小時,就會拋出OutOfMemory的錯誤訊息。

第五塊:執行時間常數池(Runtime Constant Pool)

存放的為類別中的固定的常數資訊、方法和Field的引用資訊等,其空間從方法區域中分配。

第六個區塊:本機方法堆疊(Native Method Stacks)

JVM採用本機方法堆疊來支援native方法的執行,此區域用於儲存每個native方法呼叫的狀態。

8. JVM垃圾回收

GC (Garbage Collection)的基本原理:將記憶體中不再被使用的物件回收,在GC中用於回收的方法稱為收集器,由於GC需要消耗一些資源和時間,Java在對物件的生命週期特徵進行分析後,按照新生代、舊生代的方式來對物件進行收集,以盡可能的縮短GC對應用造成的暫停

(1)對新生代的對象的收集稱為minor GC;

(2)對舊生代的對象的收集稱為Full GC;

(3)程式中主動呼叫System.gc()強制執行的GC為Full GC。

不同的物件參考類型, GC會採用不同的方法進行回收,JVM物件的引用分為了四種類型:

(1)強引用:預設情況下,物件採用的皆為強引用(這個物件的實例沒有其他物件引用,GC時才會被回收)

(2)軟引用:軟引用是Java中提供的比較適合於快取場景的應用(只有在記憶體不夠用的情況下才會被GC)

(3)弱引用:在GC時一定會被GC回收

(4)虛引用:由於虛引用只是用來得知對像是否被GC

以上是JVM簡介的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn