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

2021-03-02 bugstack蟲洞棧
目錄


一、前言

二、面試題

三、JDK、JRE、JVM

1. Java 平臺標準(JDK 8)

2. JDK 目錄結構和作用

3. JDK 是什麼?

4. JRE 是什麼?

5. JVM 是什麼?

四、總結

五、系列推薦


一、前言

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

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

想問一些面試官,是因為大家都在問所以你問,還是你想從這裡問出什麼? 其實可能很多面試官如果不了解這些技術,往往會被求職者的答案擊碎內心,哈哈哈哈哈哈。比如:梅森旋轉算法、開放尋址、斐波那契散列、啟發式清理、Javassist代理方式、擾動函數、哈希一致等等。

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

二、面試題

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

「面試官」:謝飛機寫過 Java 嗎?

「謝飛機」:那當然寫過,寫了3年多了!

「面試官」:那,JDK、JRE、JVM 之間是什麼關係?

「謝飛機」:嗯 J J J,JDK 裡面有 JRE,JVM 好像在 JRE 裡!?

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

「謝飛機」:嗯!?啥?

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

「謝飛機」:再見,面試官!

三、JDK、JRE、JVM1. 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 版本的平臺標準,可以自行比對學習,如下:

Java SE 6 Documentation:https://docs.oracle.com/javase/6/docs/Java Platform Standard Edition 7 Documentation:https://docs.oracle.com/javase/7/docs/Java Platform Standard Edition 8 Documentation:https://docs.oracle.com/javase/8/docs/2. JDK 目錄結構和作用

我們默認安裝完 JDK 會有 jdk1.8.0_45、jre1.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 .dyliblib: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的字節碼javadoc – 文檔生成器,從源碼注釋中提取文檔,注釋需符合規範jar – 打包工具,將相關的類文件打包成一個文件appletviewer – 運行和調試applet程序的工具,不需要使用瀏覽器javah – 從Java類生成C頭文件和C源文件。這些文件提供了連接膠合,使 Java 和 C 代碼可進行交互。jinfo – 獲取正在運行或崩潰的java程序配置信息idlj – IDL-to-Java 編譯器. 將IDL語言轉化為java文件policytool – 一個GUI的策略文件創建和管理工具appletviewer:小程序瀏覽器,一種執行HTML文件上的Java小程序的Java瀏覽器4. JRE 是什麼?

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

一般像是實施的工作,會在客戶現場安裝 JRE,因為這是運行 Java 程序的最低要求。

JRE 目錄結構 lib、binbin:有 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、-Xmx1024MJVM 默認在 Client 模式下,-Xms1M、-Xmx64M5.2 JVM 結構和執行器

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

Class Loader:類裝載器是用於加載類文件的一個子系統,其主要功能有三個:loading(加載),linking(連結),initialization(初始化)。JVM Memory Areas:方法區、堆區、棧區、程序計數器。Interpreter(解釋器):通過查找預定義的 JVM 指令到機器指令映射,JVM 解釋器可以將每個字節碼指令轉換為相應的本地指令。它直接執行字節碼,不執行任何優化。JIT Compiler(即時編譯器):為了提高效率,JIT Compiler 在運行時與 JVM 交互,並適當將字節碼序列編譯為本地機器代碼。典型地,JIT Compiler執行一段代碼,不是每次一條語句。優化這塊代碼,並將其翻譯為優化的機器代碼。JIT Compiler是默認開啟四、總結這篇的知識並不複雜,涉及的面試內容也較少,更多的是對接下來要講到 JVM 相關面試內容的一個開篇介紹,為後續的要講的內容做一個鋪墊。如果你在此之前沒有關注過JDK、JRE、JVM的結構和相應的組件配置以及執行模式,那麼可以在此基礎上繼續學習加深印象。另外想深入學習JVM並不太容易,既要學習JVM規範也要上手應用實踐,所以很建議先手寫JVM,再實踐驗證JVM。好了,本章節就扯到這了。這些知識點即使分享給大家,也是我自己學習、收錄、整理、驗證的過程。互相學習、互相成長,如果有錯誤之處,直接留言給我,我會不斷的改正。大家一起進步!五、系列推薦

相關焦點

  • JDK、JRE、JVM,是什麼關係?
    一、前言截至到這已經寫了22篇面經手冊,你看了多少?其實小傅哥就是借著面經的幌子在講 Java 核心技術,探索這些核心知識點面試的背後到底在問什麼。想問一些面試官,是因為大家都在問所以你問,還是你想從這裡問出什麼? 其實可能很多面試官如果不了解這些技術,往往會被求職者的答案擊碎內心,哈哈哈哈哈哈。
  • 你想了解JDK、JRE、JVM分別是什麼及它們之間的有什麼關聯嗎?
    大多數人剛接觸Java的時候都會經常看到JDK、JRE、JVM,但可能一直迷迷糊糊,不知道它們之間真正的作用和含義,而了解JDK、JRE、JVM分別是什麼及它們之間的關係有助於我們更加深刻的理解java語言的特性。
  • 最新的java(jdk+jre)完整安裝教程——附詳細步驟
    承接上文,本文將介紹java的安裝與配置,也就是jdk+jre的詳細安裝過程,以供大家參考、學習。Java/jdk/jre安裝教程安裝包的獲取注意兩點:>jdk+jre的安裝包命名一般都是這樣的:jdk-8u211-windows-x64.exe如果名稱中有bin字眼,表示只有jdk,沒有jre
  • 大型企業JVM性能調優實戰Java垃圾收集器及gcroot
    疑問:什麼是核心類 1:其實就是我們每天在開發的使用java.lang,java.util,等這些包下的類。而這個類都是存放在 jre/lib/rt.jar 中查看某個類:_211\jre\lib\ext;C:\Windows\Sun\Java\lib\ext小結擴展性的包,都屬於java第三方依賴的jar,這個擴展包是實際的開發中可以刪除,它都屬於實驗性階段。
  • Oracle,Open JDK等四大JVM性能全面對比
    或者使用如下命令:docker exec -it store/oracle/serverjre:8 java -version使用的JVM版本如下:/buildjdkcontainers.sh</pre><pre>docker-compose -f docker-compose-jdks.yml up你可以可以訪問:8080埠的haproxy9090埠的Prometheus3000埠的Grafana需要配置Grafana訪問Prometheus
  • 如何在Windows10系統中配置java的JDK環境
    操作步驟如下:1.下載好 jdk 的安裝文件,我下載的是 jdk-10.0.1_windows-x64_bin.exe 這個版本的安裝文件;2.使用滑鼠雙擊該exe文件,該exe文件會運行安裝界面,截圖如下:3.安裝程序自動執行,界面如下:
  • JVM 面試基礎準備篇(一)
    JVM 面試基礎準備篇(一)1. 計算機原理2.2.1.3.1  javap 驗證javap -v -p Person.class > vp.txt 反編譯驗證字節碼和指令信息// 打開 vp.txtClassfile /Users/xiazhaoyang/Ashe/workspace/architectrue-adventure/code-examples/jdk-jvm-analysis
  • Windows下jdk下載安裝與環境變量配置
    下載安裝jdk百度搜索jdk+版本,以1.8版本為例,百度搜索「jdk1.8」,一般是第一個。百度搜索jdk1.8打開jdk下載頁面,這裡我們下載jdk1.8 x64版本下載地址:https://jdk安裝中……jdk安裝完成後,自動打開安裝jre窗口,可以自定義安裝位置,這裡我們保持默認,下一步
  • JVM 解剖公園:JNI 臨界區與 GC Locker
    GC Locker 是什麼?3.[6]:http://hg.openjdk.java.net/jdk9/jdk9/hotspot/file/f36e864e66a7/src/share/vm/gc/shared/gcLocker.hpp[7]:http://hg.openjdk.java.net/jdk9/jdk9/hotspot/file/f36e864e66a7/src/share/vm/prims
  • 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虛擬機;程序入口
  • JVM菜鳥進階高手之路十四:分析篇
    題目回顧JVM菜鳥進階高手之路十三,問題現象就是相同的代碼,jvm參數不一樣,表現的現象不一樣。JVM垃圾回收期組合還有一個問題需要解決,jvm垃圾回收器方面,下面這個圖,我是我的JVM菜鳥進階高手之路八(一些細節),裡面的,當時依稀記得這個圖應該是飛哥發給我的。
  • JVM調優參數、方法、工具以及案例總結
    需要注意的是,jstack與top -Hp Port導出的棧埠號存在十六進位轉換關係,例如jstack導出的" nid=0xf10 "對應"3801"。= Oracle Corporationawt.toolkit = sun.awt.X11.XToolkitjava.vm.info = mixed modejava.version = 1.8.0_271java.ext.dirs = /usr/local/java/jdk1.8.0_271/jre/lib/ext:/usr/java/packages/l
  • 想理解JVM看了這篇文章,就知道了!
    本次將對jvm有更深入的學習,我們不僅要讓程序能跑起來,而且是可以跑的更快!可以分析解決在生產環境中所遇到的各種「棘手」的問題,比如運行的應用卡住了,日誌不輸出,程序沒有反應,CPU負載突然升高,多線程應用下,如何分配線程數量等。
  • centos7.2下安裝java環境(JDK1.8)
    1、去官網下載jdk1.8地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html2、下載需要帳號登錄才能獲得下載連結,獲得下載連結之後,我們可以用wget命令下載,保存到root文件夾,文件為:jdk-8u271-linux-x64.tar.gz
  • JVM、GC 大串講,面試夠用了
    JVM JRE JDK的關係JVM(java虛擬機),將 .class 文件中的字節碼指令進行識別並調用作業系統向上的 API 完成動作。JVM不僅可以運行java程序,只要是能編譯成.class的文件都能運行。JRE (Java 運行時環境),包含了jvm和core lib。JDK (Java 開發工具包),它集成了jre和一些工具。
  • JVM-概述和內存區域
    舉個例子將groovy編譯之後的class文件用jvm運行1、先配置好groovy環境什麼是方法區(Method Area)?方法區(Method Area)與Java堆一樣,是各個線程共享的內存區域。2.方法區(Method Area)存儲什麼?
  • jdk6對應的maven專題及常見問題 - CSDN
    在「環境變量」的「系統變量」選項新建系統變量:JAVA_HOME,值為:D:\Java\jdk(填寫你的JDK路徑即可)。