JDK、JRE、JVM詳解html
1、概念 java
從包含的關係上講 JDK>JRE>JVM。程序員
從概念上講JDK是JAVA開發工具,用它來開發JAVA程序。jvm
JRE是JAVA運行環境,開發出來的JAVA程序只要有JRE就能運行。工具
JVM是JAVA虛擬機,是JRE的一部分,對於JAVA類的操做基本上都是在JVM上完成的。 開發工具
圖解:spa
JDK 操作系統
JDK(Java Development Kit) 是整個JAVA的核心,包括了Java運行環境(Java Runtime Envirnment,一堆Java工具(javac/java/jdb等)和Java基礎的類庫(即Java API 包括rt.jar)。.net
JDK是JAVA開發工具包,它用來開發JAVA程序,是程序員使用java語言編寫java程序所需的開發工具包,是提供給程序員使用的。 code
JDK目錄:
bin:最主要的是編譯器(javac.exe)
include:java和JVM交互用的頭文件
lib:類庫 jre:java運行環境
(注意:這裏的bin、lib文件夾和jre裏的bin、lib是 不一樣的)
補充:一臺電腦能夠安裝多個JDK,但運行時只能用一個,切換不一樣JDK須要改變環境變量JAVA_HOME,要想同時運行能夠用虛擬機。
JRE
JRE(Java Runtime Environment,Java運行環境),是運行JAVA程序所必須的環境的集合,包含JVM標準實現及Java基礎的類庫。
JAVA運行環境,開發出來的JAVA程序只要有JRE就能運行,是使用java語言編寫的程序運行所須要的軟件環境,是提供給想運行java程序的用戶使用的。
JRE 的地位就象一臺PC機同樣,咱們寫好的Win64應用程序須要操做系統幫咱們運行,一樣的,咱們編寫的Java程序也必需要JRE才能運行。
總的來講JDK是用於java程序的開發,而jre則是隻能運行.class而沒有編譯的功能。
JVM
JVM(Java Virtual Machine),即java虛擬機, java運行時的環境,主要由字節碼指令集、寄存器、棧、垃圾回收堆和存儲方法域等構成,它是整個java實現跨平臺的最核心的部分。全部的java程序會首先被編譯爲.class的類文件,這種類文件能夠在虛擬機上執行。
圖解JVM:
JVM內存區域與GC機制相關:
http://www.javashuo.com/article/p-gvjjmhsv-hx.html
http://www.javashuo.com/article/p-tjbamxha-cy.html
2、Java語言跨平臺的特性
先說一下Java的編譯過程:
Java第一次編譯:java源程序先通過javac編譯器編譯成二進制的.class字節碼文件,
Java第二次編譯: .class文件再運行在jvm上,java解釋器(jvm的一部分)會將其解釋成對應平臺的機器碼執行。
因此java所謂的跨平臺就是在不一樣平臺上安裝了不一樣的jvm,而在不一樣平臺上生成的.class字節碼文件都是同樣的(java的跨平臺指的就是.class字節碼文件的跨平臺,.class字節碼文件是與平臺無關的),Java虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。這就是Java的可以「一次編譯,處處運行」的緣由。
JVM屏蔽了與具體操做系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就能夠在多種平臺上不加修改地運行。
圖解:
字節碼
字節碼(Bytecode)是一種包含執行程序、由一序列 op 代碼/數據對 組成的二進制文件。字節碼是一種中間狀態(中間碼)的二進制代碼(文件),它比機器碼更抽象,須要直譯器轉譯後才能成爲機器碼的中間代碼。
機器碼
機器碼(machine code),學名機器語言指令,有時也被稱爲原生碼(Native Code),是電腦的CPU可直接解讀的數據,運行速度最快。
3、聯繫和區別
1.JDK、JRE、JVM三者聯繫:
JVM不能單獨搞定class的執行,解釋.class的時候JVM須要調用解釋所須要的類庫lib。在JDK下面的的jre目錄裏面有兩個文件夾bin和lib,在這裏能夠認爲bin裏的就是jvm,lib中則是jvm工做所須要的類庫,而jvm和 lib和起來就稱爲jre。JVM+Lib=JRE。
整體來講就是,咱們利用JDK(調用JAVA API)開發了屬於咱們本身的JAVA程序後,經過JDK中的編譯程序(javac)將咱們的文本java文件編譯成.class字節碼,在JRE上運行這些字節碼,JVM解析這些字節碼,映射到CPU指令集或OS的系統調用。
2.JDK、JRE、JVM三者區別:
a.JDK和JRE區別:在bin文件夾下會發現,JDK有javac.exe而JRE裏面沒有,javac指令是用來將java文件編譯成class文件的,這是開發者須要的,而用戶(只須要運行的人)是不須要的。JDK還有jar.exe, javadoc.exe等等用於開發的可執行指令文件。這也證明了一個是開發環境,一個是運行環境。
b.JRE和JVM區別:JVM並不表明就能夠執行class了,JVM執行.class還須要JRE下的lib類庫的支持,尤爲是rt.jar。
參考連接:
https://www.cnblogs.com/xiaocao123/p/10534710.html