你想了解JDK、JRE、JVM分別是什麼及它們之間的有什麼關聯嗎?

2020-12-16 程序猿的內心獨白

大多數人剛接觸Java的時候都會經常看到JDK、JRE、JVM,但可能一直迷迷糊糊,不知道它們之間真正的作用和含義,而了解JDK、JRE、JVM分別是什麼及它們之間的關係有助於我們更加深刻的理解java語言的特性。

Java程序是運行在JVM(Java虛擬機)上的,在開發程序之前要配置Java開發環境,而配置環境要做的就是JDK的安裝和配置。

三者的大致結構是這樣的,簡單來說就是JDK包含JRE,JRE又包含JVM的關係。如下圖所示:

JDK簡單介紹

JDK:Java Development Kit 是Java的標準開發工具包(普通用戶只需要安裝 JRE來運行 Java 程序。而程序開發者必須安裝JDK來編譯、調試程序)。它提供了編譯、運行Java程序所需的各種工具和資源,包括Java編譯器、Java運行環境JRE,以及常用的Java基礎類庫等,是整個JAVA的核心。

JDK一般有三種版本:

SE(J2SE),standard edition,標準版,是我們通常用的一個版本 EE(J2EE),enterpsise edtion,企業版,使用這種JDK開發J2EE應用程式, ME(J2ME),micro edtion,主要用於行動裝置、嵌入式設備上的java應用程式 (相對來說現在使用的很少了)

JDK安裝目錄下各個子文件目錄和文檔作用的詳細介紹

下圖是Java8中JDK的安裝目錄

bin文件裡面存放了JDK的各種開發工具的可執行文件,主要的是編譯器(javac.exe)

db文件是一個先進的全事務處理的基於Java技術的資料庫(jdk自帶資料庫db的使用)

include文件裡面是Java和jvm交互用的頭文件

jre為java運行環境

lib文件存放的是JDK工具命令的實際執行程序

JRE

JRE:Java runtime environment 是運行基於Java語言編寫的程序所不可缺少的運行環境,用於解釋執行Java的字節碼文件。

也是通過它,Java的開發者才得以將自己開發的程序發布到用戶手中,讓用戶使用。JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,這些是運行Java程序的必要組件。與大家熟知的JDK不同,JRE是Java運行環境,並不是一個開發環境,所以沒有包含任何開發工具(如編譯器和調試器),只是針對於使用Java程序的用戶。

下圖是Java8中JRE的安裝目錄,裡面有兩個文件夾bin和lib。你可以認為bin裡的就是JVM,lib中則是JVM工作所需要的類庫,而JVM和 lib和起來就稱為JRE

從JDK11開始,JDK和JRE都是在一起的,安裝後默認是沒有JRE的。如果需要JRE這個單獨目錄,可以在JDK目錄下面去打開命令窗口,然後執行如下命令(win10執行這個生成JRE需要目錄權限):

bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre  

執行完之後就會生成JRE,但無論使用tomcat 還是eclipse,沒有JRE文件夾實際上並不影響你的使用。

JVM

JVM:Java Virtual Machine 是Java的虛擬機,是JRE的一部分。它是整個java實現跨平臺的最核心的部分,負責解釋執行字節碼文件,是可運行java字節碼文件的虛擬計算機。

所有平臺的上的JVM向編譯器提供相同的接口,而編譯器只需要面向虛擬機,生成虛擬機能識別的代碼,然後由虛擬機來解釋執行。

Java跨平臺的原因

使用Java編譯器編譯Java程序時,生成的是與平臺無關的字節碼,這些字節碼只面向JVM。不同平臺的JVM都是不同的,但它們都提供了相同的接口。

JVM是Java程序跨平臺的最核心的部分,只要為不同平臺實現了相應的虛擬機,編譯後的Java字節碼就可以在該平臺上運行。其屏蔽了與具體作業系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。

正是因為有了JVM的存在,Java才實現了強大的跨平臺特性。

jvm執行程序的過程

1、加載.class 文件

所有的java程序會首先被編譯為.class的類文件,這種類文件可以在虛擬機上執行。也就是說class並不直接與機器的作業系統相對應,而是經過虛擬機間接與作業系統交互,由虛擬機將程序解釋給本地系統執行。只有JVM還不能成功執行.class的類文件,因為在解釋class的時候JVM需要調用解釋所需要的類庫lib,而jre包含lib類庫。

運行class文件

可以在命令行中輸入 java 字節碼文件名 ,此時啟動了一個jvm,加載字節碼文件名.class字節碼文件到內存,然後jvm運行內存中的字節碼指令

在IDE上就類似於點擊運行按鈕。

2、管理並分配內存

3、執行垃圾收集調用垃圾收集器進行垃圾回收

三者的區別與聯繫

JDK用於開發,是給開發人員用的,JRE 用於運行java程序,和JVM是給普通用戶使用的。如果只是運行Java程序,可以只安裝JRE,無序安裝JDK。也就是說:使用JDK開發完成的java程序,交給JRE去運行。

JDK包含了JRE,JDK 和 JRE 中都包含 JVM。也可以說JDK是JRE+Java的開發工具。JRE包含了JVM+Java語言的核心類庫。

相關焦點

  • JDK、JRE、JVM,是什麼關係?
    一、前言截至到這已經寫了22篇面經手冊,你看了多少?其實小傅哥就是借著面經的幌子在講 Java 核心技術,探索這些核心知識點面試的背後到底在問什麼。想問一些面試官,是因為大家都在問所以你問,還是你想從這裡問出什麼? 其實可能很多面試官如果不了解這些技術,往往會被求職者的答案擊碎內心,哈哈哈哈哈哈。
  • 面經手冊 · 第23篇《JDK、JRE、JVM,是什麼關係?》
    😄其實小傅哥就是借著面經的幌子在講 Java 核心技術,探索這些核心知識點面試的背後到底在問什麼。想問一些面試官,是因為大家都在問所以你問,還是你想從這裡問出什麼? 其實可能很多面試官如果不了解這些技術,往往會被求職者的答案擊碎內心,哈哈哈哈哈哈。
  • 大型企業JVM性能調優實戰Java垃圾收集器及gcroot
    疑問:什麼是核心類 1:其實就是我們每天在開發的使用java.lang,java.util,等這些包下的類。而這個類都是存放在 jre/lib/rt.jar 中查看某個類:『目的是:類加載器之間不存在父類子類的關係,「雙親」 只是一種翻譯,而用邏輯邏輯上的上下級關係,責任劃分的關係。也是為了安全性去考慮。比如核心類庫中的String.class ,如果去修改的話是有風險的。如果我們不指定parentLoader 默認也會去加載AppClassLoader加載器。
  • Oracle,Open JDK等四大JVM性能全面對比
    有很多人都會懷疑,Oracle JDK和其他JDK之間有沒有很大的性能差異,本文作者通過多方面測試,給出這個問題的答案,適合Java程式設計師研讀。市面上可供選擇的JVM發行版還是有不少的。選擇合適的JVM需要考慮不同的因素。性能是其中一個重要的因素。靠譜的性能研究是很困難的。在本文中,我創建了一個測試,在不同的JVM上執行對比測試。
  • 最新的java(jdk+jre)完整安裝教程——附詳細步驟
    承接上文,本文將介紹java的安裝與配置,也就是jdk+jre的詳細安裝過程,以供大家參考、學習。Java/jdk/jre安裝教程安裝包的獲取注意兩點:>jdk+jre的安裝包命名一般都是這樣的:jdk-8u211-windows-x64.exe如果名稱中有bin字眼,表示只有jdk,沒有jre
  • 程式設計師:想自己寫框架?不了解Java註解機制可不行
    無論是在JDK還是框架中,註解都是很重要的一部分,我們使用過很多註解,但是你有真正去了解過他的實現原理麼?你有去自己寫過註解麼?概念註解(Annotation),也叫元數據。一種代碼級別的說明。它是JDK1.5及以後版本引入的一個特性,與類、接口、枚舉是在同一個層次。
  • Windows下jdk下載安裝與環境變量配置
    下載安裝jdk百度搜索jdk+版本,以1.8版本為例,百度搜索「jdk1.8」,一般是第一個。jdk1.8下載頁面下載歷史版本的jdk自動跳轉登錄,需要登錄你的Oracle帳號才能下載,用郵箱註冊登錄就可以,登錄成功自動下載。
  • JVM 解剖公園:JNI 臨界區與 GC Locker
    GC Locker 是什麼?3.顯然這會有一些限制:>>>調用 `GetPrimitiveArrayCritical` 後,原生代碼在調用 `ReleasePrimitiveArrayCritical` 前不應該長時間運行。兩個函數之間的代碼應視為「臨界區」。
  • 5款新手常用的java編程工具,有你正在用的嗎?
    文:源碼時代新手如果想成為一名合格的java程式設計師工程師,不但要熟練使用各種框架,而且還有明白框架是如何實現的各種原理,例如像jvm虛擬機的原理,優化,熟練掌握jvm能讓你寫出性能更好的代碼,還有池技術,對象池,線程池等,目前人們對java編程的關注也越來越火熱,很多人對編程有很大的興趣,也想知道有哪些好用的java編程工具,接下來就為大家介紹幾款常用的相關編程工具
  • JVM-概述和內存區域
    舉個例子將groovy編譯之後的class文件用jvm運行1、先配置好groovy環境方法區和堆區是所有線程共享的內存區域;Java棧又叫做jvm虛擬機棧。執行引擎等同於翻譯class文件的語言翻譯器。
  • JVM、GC 大串講,面試夠用了
    JRE (Java 運行時環境),包含了jvm和core lib。JDK (Java 開發工具包),它集成了jre和一些工具。比如javac.exe,java.exe,jar.exe等。大家都知道,要想執行java程序,需要安裝jdk。JVM 初識JVM其實是一種規範,它提供可以執行Java字節碼的運行時環境。不同的供應商提供這種規範的不同實現。
  • 如何在Windows10系統中配置java的JDK環境
    操作步驟如下:1.下載好 jdk 的安裝文件,我下載的是 jdk-10.0.1_windows-x64_bin.exe 這個版本的安裝文件;2.使用滑鼠雙擊該exe文件,該exe文件會運行安裝界面,截圖如下:3.安裝程序自動執行,界面如下:
  • JVM調優參數、方法、工具以及案例總結
    主要圍繞四個大的方面展開,分別是JVM調優參數、JVM調優方法(流程)、JVM調優工具、JVM調優案例,調優案例目前正在分析,會在將來補上。一般情況下追求吞吐量的有以下領域:科學計算、數據挖掘等。吞吐量優先的垃圾處理器組合一般為:Parallel Scavenge + Parallel Old (PS + PO)。而追求響應時間的業務有:網站相關 (JDK 1.8之後 G1,之前可以ParNew + CMS + Serial Old)什麼是調優?
  • 想理解JVM看了這篇文章,就知道了!
    本次將對jvm有更深入的學習,我們不僅要讓程序能跑起來,而且是可以跑的更快!可以分析解決在生產環境中所遇到的各種「棘手」的問題,比如運行的應用卡住了,日誌不輸出,程序沒有反應,CPU負載突然升高,多線程應用下,如何分配線程數量等。
  • 手把手編譯自己的JDK
    Stay hungry, Stay foolish ~背景想要了解Java虛擬機內部的實現原理,最直接的方式是編譯一套自己的JDK,通過閱讀和跟蹤調試JDK源碼來了解Java技術體系的運行。配置編譯環境獲取JDK源碼有兩種方式:(1)通過Mercurial代碼版本管理工具從Repository(https://hg.openjdk.java.net/jdk/jdk12)中直接取得源碼。
  • 聊到JVM(還怕面試官問JVM嗎?)
    虛擬機為不同的類加載器載入的類提供不同的命名空間,命名空間由一系列唯一的名稱組成,每一個被裝載的類將有一個名字,這個命名空間是由Java虛擬機為每一個類裝載器維護的,它們互相之間甚至不可見。從最內層JVM自帶類加載器開始加載,外層惡意同名類得不到加載從而無法使用;由於嚴格通過包來區分了訪問域,外層惡意的類通過內置代碼也無法獲得權限訪問到內層類,破壞代碼就自然無法生效。
  • OpenJdk1.8筆記——java啟動流程
    Jdk中java的入口函數文件為openjdk\jdk\src\share\bin\main.c中的main方法(window上為WinMain),然後調用jdk8u-dev/jdk/src/share/bin/java.c的JLI_Launch方法,啟動一個jvm虛擬機;程序入口