理解Java裏面的jvm,jre,jdk的區別和聯繫

有時候越是基礎的問題,越是容易被咱們忽視,好比標題上的問題,感受挺簡單,但真正讓解釋一下,未必可以說的很清楚,其實這個問題在Oracle官網的Java的文檔裏面解釋的很是清晰,看官網下面的一張圖:php

image

先解釋下幾個名詞的意思:html

(一)JVM(Java Virtual Machine ):Java虛擬機java

主要負責將class文件也就是bytecode編碼解釋爲機器可以識別的010101相似的編碼,而後執行程序。由於JVM在主流平臺都有對應實現,因此咱們常常說JVM是跨平臺的,只須要一次編寫,即可以處處運行,其實這裏面都是JVM屏蔽了底層操做系統的細節。網絡

(二)JRE(Java Runtime Environment ):Java運行時環境數據結構

jre包含了jvm,此外還有一些java內置的Libraries,如集合類,併發類,數學函數等併發

(三)JDK(Java Development Kit ):Java開發工具包oracle

jdk包含了jre,額外還提供了java源碼編譯和調試的功能等等,所以JDK是咱們每一個Java開發者必安裝的一個組件。less

從上圖可以看出:jvm

jdk包含jre,而jre又包含jvm,若是隻須要運行java程序,其實只安裝一個jre便可,若是還要開發和調試那就必須安裝JDK了。函數

接下來思考一個問題咱們寫的java源碼文件是如何被執行的?

看下面的一個圖:

image

主要經歷了下面的四個流程:

(1)先由開發人員編寫出程序也就是咱們的源碼文件

(2)由JDK將其編譯爲class文件,注意這個文件是字節碼,人眼不可讀的

(3)由JRE裏面的類加載器(Class Loader)負責把字節碼文件加載,而後校驗,準備,解析。注意加載這塊是能夠從網絡上讀取class文件,也能夠從本地磁盤裏讀取。

(4)最後由JVM負責把字節碼解釋成機器識別的01010碼,而後初始化程序並負責執行

在整個過程當中Java裏面出現了編譯和解釋的操做,因此能夠理解Java是一門編譯和解釋性語言。在上面的整個流程中,有一個步驟,比較關鍵,就是類加載器這步。

關於Java裏面的類加載器的工做模式,咱們能夠看下面的一個圖:

image

Java裏面的類加載器採用了雙親委派的模式,從上圖能夠看出,當加載一個class的文件名時,首先會從第一級的引導加載器開始尋找,若是沒有就返回到第二級的擴展類加載器裏面尋找這個class文件,若是再沒有,就從咱們應用加載器也就是系統依賴的包裏面尋找,若是找到就行後面的步驟,若是仍然沒有找到,就會拋出ClassNotFoundException異常,平常開發中常見的另一個種異常是ClassNotDefFoundException,這種異常是加載a.class時,引用了b.class這時候若是b.class找不到就會這個異常,瞭解這些細節,對咱們開發和調試就會有比較大的幫助。

總結:

本篇主要介紹了Java裏面幾個比較重要的概念,分別是JVM,JRE,JDK以及他們的工做流程,此外還着重了提了下類加載器的工做原理,理解他們的工做模式,有助於咱們更好的使用Java語言,固然關於JVM的具體運行時的內存數據結構和垃圾回收機制本篇並無細說,這個後面有空能夠在總結下。

參考連接:

https://docs.oracle.com/javase/8/docs/index.html

http://www.careerbless.com/java/basics/JavaArchitecture.php

相關文章
相關標籤/搜索