1. 程式人生 > >解釋JDK、JRE、JVM

解釋JDK、JRE、JVM

轉載:https://blog.csdn.net/songkai320/article/details/51819046
需要學習的童鞋請檢視以上鍊接原文,轉載純屬自己容易找到

首先是JDK

1、JDK(Java Development Kit) 是 Java 語言的軟體開發工具包(SDK)。在JDK的安裝目錄下有一個jre目錄,裡面有兩個資料夾bin和lib,在這裡可以認為bin裡的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib合起來就稱為jre。
然後我們來看JRE
2、JRE(Java Runtime Environment,Java執行環境),包含JVM標準實現及Java核心類庫。JRE是Java執行環境,並不是一個開發環境,所以沒有包含任何開發工具(如編譯器和偵錯程式)
最後JVM也一目瞭然了
3、JVM是Java Virtual Machine(Java虛擬機器)的縮寫

,JVM是一種用於計算裝置的規範,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。
這裡寫圖片描述
由上圖一目瞭然:
JDK是整個Java的核心,包括了Java執行環境JRE、Java工具和Java基礎類庫。JRE是執行JAVA程式所必須的環境的集合,包含JVM標準實現及Java核心類庫。JVM是整個java實現跨平臺的最核心的部分,能夠執行以Java語言寫的程式。
JVM體系結構與執行原理:
Java語言寫的源程式通過Java編譯器,編譯成與平臺無關的‘位元組碼程式’(.class檔案,也就是0,1二進位制程式),然後在OS之上的Java直譯器中解釋執行。
這裡寫圖片描述

JVM整個類載入過程的步驟:
1. 裝載

裝載過程負責找到二進位制位元組碼並載入至JVM中,JVM通過類名、類所在的包名通過ClassLoader來完成類的載入,同樣,也採用以上三個元素來標識一個被載入了的類:類名+包名+ClassLoader例項ID。

  1. 連結

連結過程負責對二進位制位元組碼的格式進行校驗、初始化裝載類中的靜態變數以及解析類中呼叫的介面、類。

完成校驗後,JVM初始化類中的靜態變數,並將其值賦為預設值。

最後對類中的所有屬性、方法進行驗證,以確保其需要呼叫的屬性、方法存在,以及具備應的許可權(例如public、private域許可權等),會造成NoSuchMethodError、NoSuchFieldError等錯誤資訊。

  1. 初始化

初始化過程即為執行類中的靜態初始化程式碼、構造器程式碼以及靜態屬性的初始化,在四種情況下初始化過程會被觸發執行:

呼叫了new;

反射呼叫了類中的方法;

子類呼叫了初始化;

JVM啟動過程中指定的初始化類。
這裡寫圖片描述

ClassLoader抽象類的幾個關鍵方法:

(1) loadClass

此方法負責載入指定名字的類,ClassLoader的實現方法為先從已經載入的類中尋找,如沒有則繼續從parent ClassLoader中尋找,如仍然沒找到,則從System ClassLoader中尋找,最後再呼叫findClass方法來尋找,如要改變類的載入順序,則可覆蓋此方法

(2) findLoadedClass

此方法負責從當前ClassLoader例項物件的快取中尋找已載入的類,呼叫的為native的方法。

(3) findClass

此方法直接丟擲ClassNotFoundException,因此需要通過覆蓋loadClass或此方法來以自定義的方式載入相應的類。

(4) findSystemClass

此方法負責從System ClassLoader中尋找類,如未找到,則繼續從Bootstrap ClassLoader中尋找,如仍然為找到,則返回null。

(5) defineClass

此方法負責將二進位制的位元組碼轉換為Class物件

(6) resolveClass

此方法負責完成Class物件的連結,如已連結過,則會直接返回。

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進行回收。

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

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

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

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

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

第六塊:本地方法堆疊(Native Method Stacks)

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