一分鐘弄懂JDK,JRE,JWM

首先是JDK

JDK(Java Development Kit) 是 Java 語言的軟件開發工具包(SDK)。在JDK的安裝目錄下有一個jre目錄,裏面有兩個文件夾bin和lib,在這裏可以認爲bin裏的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib合起來就稱爲jre。

然後我們來看JRE

JRE(Java Runtime Environment,Java運行環境),包含JVM標準實現及Java核心類庫。JRE是Java運行環境,並不是一個開發環境,所以沒有包含任何開發工具(如編譯器和調試器)

最後JVM也一目瞭然了

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實例對應了一個獨立運行的java程序它是進程級別
    

a) 啓動。啓動一個Java程序時,一個JVM實例就產生了,任何一個擁有public static void main(String[] args)函數的class都可以作爲JVM實例運行的起點

b) 運行。main()作爲該程序初始線程的起點,任何其他線程均由該線程啓動。JVM內部有兩種線程:守護線程和非守護線程,main()屬於非守護線程,守護線程通常由JVM自己使用,java程序也可以標明自己創建的線程是守護線程

c) 消亡。當程序中的所有非守護線程都終止時,JVM才退出;若安全管理器允許,程序也可以使用Runtime類或者System.exit()來退出

  1.   JVM執行引擎實例則對應了屬於用戶運行程序的線程它是線程級別的
    

JVM的體系結構

  1.   類裝載器(ClassLoader)(用來裝載.class文件)
    
  2.   執行引擎(執行字節碼,或者執行本地方法)
    
  3.   運行時數據區(方法區、堆、java棧、PC寄存器、本地方法棧)
    

JVM整個類加載過程的步驟:

  1.   裝載
    

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

  1.   鏈接
    

鏈接過程負責對二進制字節碼的格式進行校驗、初始化裝載類中的靜態變量以及解析類中調用的接口、類。

完成校驗後,JVM初始化類中的靜態變量,並將其值賦爲默認值。

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

  1.   初始化
    

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

調用了new;

反射調用了類中的方法;

子類調用了初始化;

JVM啓動過程中指定的初始化類。

JVM類加載順序:

JVM兩種類裝載器包括:啓動類裝載器和用戶自定義類裝載器。

啓動類裝載器是JVM實現的一部分;

用戶自定義類裝載器則是Java程序的一部分,必須是ClassLoader類的子類。

image

最新2020整理收集的一些高頻面試題(都整理成文檔),有很多幹貨,包含mysql,netty,spring,線程,spring cloud、jvm、源碼、算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,
需要獲取這些內容的朋友請加Q君樣:
756584822

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章