面經手冊 · 第23篇《JDK、JRE、JVM,是什麼關係?》


做者:小傅哥
博客:https://bugstack.cn
Github:https://github.com/fuzhengwei/CodeGuide/wikihtml

沉澱、分享、成長,讓本身和他人都能有所收穫!😄

1、前言

截至到這已經寫了22篇面經手冊,你看了多少?java

😄其實小傅哥就是藉着面經的幌子在講 Java 核心技術,探索這些核心知識點面試的背後到底在問什麼。git

想問一些面試官,是由於你們都在問因此你問,仍是你想從這裏問出什麼? 其實可能不少面試官若是不瞭解這些技術,每每會被求職者的答案擊碎心裏,哈哈哈哈哈哈。好比:梅森旋轉算法開放尋址斐波那契散列啓發式清理Javassist代理方式擾動函數哈希一致等等。程序員

記住,讓懂了就是真的懂,比看水文、背答案要爽的多!嗯,就是有時候燒腦!github

2、面試題

謝飛機,小記!,也不知道咋了,總感受有些面試攻擊性不大,但侮辱性極強面試

面試官:謝飛機寫過 Java 嗎?算法

謝飛機:那固然寫過,寫了3年多了!數據庫

面試官:那,JDKJREJVM 之間是什麼關係?編程

謝飛機:嗯 J J J,JDK 裏面有 JRE,JVM 好像在 JRE 裏!?小程序

面試官:那,Client模式、Server模式是啥?

謝飛機:嗯!?啥?

面試官:好吧,問個簡單的。JVM 是如何工做的?背答案了嗎?

謝飛機:再見,面試官!

3、JDK、JRE、JVM

1. Java 平臺標準(JDK 8)

Oracle has two products that implement Java Platform Standard Edition (Java SE) 8: Java SE Development Kit (JDK) 8 and Java SE Runtime Environment (JRE) 8.

JDK 8 is a superset of JRE 8, and contains everything that is in JRE 8, plus tools such as the compilers and debuggers necessary for developing applets and applications. JRE 8 provides the libraries, the Java Virtual Machine (JVM), and other components to run applets and applications written in the Java programming language. Note that the JRE includes components not required by the Java SE specification, including both standard and non-standard Java components.

The following conceptual diagram illustrates the components of Oracle's Java SE products:

Description of Java Conceptual Diagram

Java Platform Standard Edition 8 Documentation

關於 JDK、JRE、JVM 之間是什麼關係,在 Java 平臺標準中已經明肯定義了。也就是上面的英文介紹部分。

  • Oracle 有兩個 Java 平臺標準的產品,Java SE 開發工具包(JDK) 和 Java SE 運行時環境(JRE)。
  • JDK(Java Development Kit Java開發工具包),JDK是提供給Java開發人員使用的,其中包含了java的開發工具,也包括了JRE。因此安裝了JDK,就不用在單獨安裝JRE了。其中的開發工具包括編譯工具(javac.exe) 打包工具(jar.exe)等。
  • JRE(Java Runtime Environment Java運行環境) 是 JDK 的子集,也就是包括 JRE 全部內容,以及開發應用程序所需的編譯器和調試器等工具。JRE 提供了庫、Java 虛擬機(JVM)和其餘組件,用於運行 Java 編程語言、小程序、應用程序。
  • JVM(Java Virtual Machine Java虛擬機),JVM能夠理解爲是一個虛擬出來的計算機,具有着計算機的基本運算方式,它主要負責把 Java 程序生成的字節碼文件,解釋成具體系統平臺上的機器指令,讓其在各個平臺運行。

綜上,從這段官網的平臺標準介紹和概念圖能夠看出,咱們運行程序的 JVM 是已經安裝到 JDK 中,只不過可能你開發了好久的代碼,也沒有注意過。沒有注意過的最大緣由是,沒有開發過一些和 JVM 相關的組件代碼

關於,各 JDK 版本的平臺標準,能夠自行比對學習,以下:

2. JDK 目錄結構和做用

咱們默認安裝完 JDK 會有 jdk1.8.0_45jre1.8.0_45,兩個文件夾。其實在 JDK 的文件中還會有 JRE 的文件夾,他們兩個 JRE 文件夾的結構是同樣的。

JDK 目錄結構

  • bin:一堆 EXE 可執行文件,java.exe、javac.exe、javadoc.exe,已經密鑰管理工具等。
  • db:內置了 Derby 數據庫,體積小,免安裝。
  • include:Java 和 JVM 交互的頭文件,例如咱們 JVMTI 寫的 C++ 工程時,就須要把這個 include 包引入進去jvmti.h例如:基於jvmti設計非入侵監控
  • jre:Java 運行環境,包含了運行時須要的可執行文件,以及運行時須要依賴的 Java 類庫和動態連接庫.so .dll .dylib
  • lib:Java 類庫,例如 dt.jar、tools.jar

那麼 jvm 在哪一個文件夾呢?

jvm.dll

可能你以前並無注意過 jvm 原來在這裏:C:\Program Files\Java\jdk1.8.0_45\jre\bin\server

  • 這部分是整個 Java 實現跨平臺的最核心內容,由 Java 程序編譯成的 .class 文件會在虛擬機上執行。
  • 另外在 JVM 解釋 class 文件時須要調用類庫 lib。在 JRE 目錄下有兩個文件夾 lib、bin,而 lib 就是 JVM 執行所須要的類庫。
  • jvm.dll 並不能獨立工做,當 jvm.dll 啓動後,會使用 explicit 方法來載入輔助動態連接庫一塊兒執行。

3. JDK 是什麼?

綜上經過 Java 平臺標準JDK 的目錄結構,JDK 是 JRE 的超集,JDK 包含了 JRE 全部的開發、調試以及監視應用程序的工具。以及以下重要的組件:

  • java – 運行工具,運行 .class 的字節碼
  • javac– 編譯器,將後綴名爲.java的源代碼編譯成後綴名爲.class的字節碼
  • javap – 反編譯程序
  • javadoc – 文檔生成器,從源碼註釋中提取文檔,註釋需符合規範
  • jar – 打包工具,將相關的類文件打包成一個文件
  • jdb – debugger,調試工具
  • jps – 顯示當前java程序運行的進程狀態
  • appletviewer – 運行和調試applet程序的工具,不須要使用瀏覽器
  • javah – 從Java類生成C頭文件和C源文件。這些文件提供了鏈接膠合,使 Java 和 C 代碼可進行交互。
  • javaws – 運行 JNLP 程序
  • extcheck – 一個檢測jar包衝突的工具
  • apt – 註釋處理工具
  • jhat – java堆分析工具
  • jstack – 棧跟蹤程序
  • jstat – JVM檢測統計工具
  • jstatd – jstat守護進程
  • jinfo – 獲取正在運行或崩潰的java程序配置信息
  • jmap – 獲取java進程內存映射信息
  • idlj – IDL-to-Java 編譯器. 將IDL語言轉化爲java文件
  • policytool – 一個GUI的策略文件建立和管理工具
  • jrunscript – 命令行腳本運行
  • appletviewer:小程序瀏覽器,一種執行HTML文件上的Java小程序的Java瀏覽器

4. JRE 是什麼?

JRE 自己也是一個運行在 CPU 上的程序,用於解釋執行 Java 代碼。

通常像是實施的工做,會在客戶現場安裝 JRE,由於這是運行 Java 程序的最低要求。

JRE 目錄結構 lib、bin

  • bin:有 java.exe 但沒有 javac.exe。也就是沒法編譯 Java 程序,但能夠運行 Java 程序,能夠把這個bin目錄理解成JVM。
  • lib:Java 基礎&核心類庫,包含 JVM 運行時須要的類庫和 rt.jar。也包含用於安全管理的文件,這些文件包括安全策略(security policy)和安全屬性(security properties)等。

5. JVM 是什麼?

其實簡單說 JVM 就是運行 Java 字節碼的虛擬機,JVM 是一種規範,各個供應商均可以實現本身 JVM虛擬機。就像小傅哥本身也按照虛擬機規範和手寫JVM的相關書籍實現了,基於Java實現的JVM虛擬機。

用Java實現JVM源碼

源碼地址https://github.com/fuzhengwei/itstack-demo-jvm
內容簡介:本代碼主要介紹如何經過 java 代碼來實現 JVM 的基礎功能(搜索解析class文件、字節碼命令、運行時數據區等),從而讓java程序員經過最熟知的java程序,學習JVM是如何將java程序一步步跑起來的。

固然,咱們下載 Oracle 公司的 JVM 與本身實現的相比,要高級的多。他們的設計有不斷優化的內存模型、GC回收策略、自適應優化器等。

另外,JVM 之因此稱爲虛擬機,主要就是由於它爲了實現 「write-once-run-anywhere」。提供了一個不依賴於底層操做系統和機器硬件結構的運行環境。

5.1 Client模式、Server模式

在 JVM 中有兩種不一樣風格的啓動模式, Client模式、Server模式。

  • Client模式:加載速度較快。能夠用於運行GUI交互程序。
  • Server模式:加載速度較慢但運行起來較快。能夠用於運行服務器後臺程序。

修改配置模式文件:C:\\Program Files\\Java\\jre1.8.0_45\\lib\\amd64\\jvm.cfg

# List of JVMs that can be used as an option to java, javac, etc.
# Order is important -- first in this list is the default JVM.
# NOTE that this both this file and its format are UNSUPPORTED and
# WILL GO AWAY in a future release.
#
# You may also select a JVM in an arbitrary location with the
# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
# and may not be available in a future release.
#
-server KNOWN
-client IGNORE
  • 若是須要調整,能夠把 client 設置爲 KNOWN,並調整到 server 前面。
  • JVM 默認在 Server模式下,-Xms128M、-Xmx1024M
  • JVM 默認在 Client 模式下,-Xms1M、-Xmx64M

5.2 JVM 結構和執行器

這部分屬於 JVM 的核心知識,但不是本篇重點,會在後續的章節中陸續講到。本章只作一些介紹。

  • Class Loader:類裝載器是用於加載類文件的一個子系統,其主要功能有三個:loading(加載),linking(連接),initialization(初始化)。
  • JVM Memory Areas:方法區、堆區、棧區、程序計數器。
  • Interpreter(解釋器):經過查找預約義的 JVM 指令到機器指令映射,JVM 解釋器能夠將每一個字節碼指令轉換爲相應的本地指令。它直接執行字節碼,不執行任何優化。
  • JIT Compiler(即時編譯器):爲了提升效率,JIT Compiler 在運行時與 JVM 交互,並適當將字節碼序列編譯爲本地機器代碼。典型地,JIT Compiler執行一段代碼,不是每次一條語句。優化這塊代碼,並將其翻譯爲優化的機器代碼。JIT Compiler是默認開啓

4、總結

  • 這篇的知識並不複雜,涉及的面試內容也較少,更多的是對接下來要講到 JVM 相關面試內容的一個開篇介紹,爲後續的要講的內容作一個鋪墊。
  • 若是你在此以前沒有關注過JDK、JRE、JVM的結構和相應的組件配置以及執行模式,那麼能夠在此基礎上繼續學習加深印象。另外想深刻學習JVM並不太容易,既要學習JVM規範也要上手應用實踐,因此很建議先手寫JVM,再實踐驗證JVM。
  • 好了,本章節就扯到這了。這些知識點即便分享給你們,也是我本身學習、收錄、整理、驗證的過程。互相學習、互相成長,若是有錯誤之處,直接留言給我,我會不斷的改正。你們一塊兒進步!

5、系列推薦

相關文章
相關標籤/搜索