java教程系列二:Java JDK,JRE和JVM分別是什么?


多情只有春庭月,猶為離人照落花。

https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/java/java11.jpg

概述

本章主要了解JDK,JRE和JVM之間的區別。JVM是如何工作的?什么是類加載器,解釋器和JIT編譯器。還有一些面試問題。

Java程序執行過程

在深入了解Java內存區域之前,我們先了解Java源文件是如何執行的。

  1. 我們使用編輯器在Simple.Java文件中編寫源代碼。
  2. 程序必須編譯成字節碼。編譯器(javac)將源代碼編譯為Simple.class文件。
  3. 此后綴為.class的類文件可以在任何平台/操作系統的的JVMJava虛擬機)中執行。
  4. JVM負責將字節碼轉換為機器可執行的本機機器代碼。

https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/java/java12.png

什么是JVM?

Java虛擬機(JVM)是​​運行Java字節碼的虛擬機。可以通過javax.java文件編譯成.class文件。.class文件包含JVM可解析的字節碼。

事實上,JVM只是為Java字節碼提供了運行時環境和規范。不同的廠商提供此規范的不同實現。例如,此Wiki頁面列出了其它JVM實現

最受歡迎的JVM虛擬機是Oracle公司提供的Hostspot虛擬機,(前身是Sun Microsystems,Inc.)。

JVM虛擬機使用許多先進技術,結合了最新的內存模型,垃圾收集器和自適應優化器,為Java應用程序提供了最佳性能。

JVM虛擬機有兩種不同的模式,client模式和server模式。盡管serverclient相似,但server進行了特殊調整,以最大程度地提高峰值運行速度。它用於長時間運行的服務器應用程序,它們需要盡可能快的運行速度,而不是快速啟動或較小的運行時內存占用量。開發人員可以通過指定-client-server來選擇所需的模式。

JVM之所以稱為虛擬機,是因為它提供的API不依賴於底層操作系統和機器硬件體系結構。這種與硬件和操作系統的獨立性是Java程序一次寫入,隨處運行必要基礎。

JVM架構

https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/java/java13.png

類加載器

類加載器是用於加載類文件到JVM中。主要分為以下三步 加載,鏈接和初始化。

  1. 加載
  • 為了加載類,JVM有3種類加載器。Bootstrap, extension和應用程序類加載器。
  • 加載類文件時,JVM會找到這個類的所有依賴項。
  • 首先類加載會判斷當前類加載器是否存在父類,如果存在則交給父加載器加載。
  • Bootstrap為根類加載器,Bootstrap加載器嘗試查找該類。它掃描JRE lib文件夾中的rt.jar
  • 如果找不到類,那么extension加載器將在jre \ lib \ ext包中搜索類文件。
  • 如果還找不到類,則應用程序類加載器將在系統的 CLASSPATH環境變量中搜索所有Jar文件和類
  • 任何類加載程序找到了類,則由該類加載器加載類;否則拋出ClassNotFoundException
  1. 鏈接 : 類加載器加載類后,將執行鏈接。字節碼驗證程序將驗證生成的字節碼是否正確,如果驗證失敗,我們將收到驗證錯誤。它還會對類中的靜態變量和方法執行內存分配。
  2. 初始化 : 這是類加載的最后階段,此處將為所有靜態變量分配原始值,並執行靜態塊。
JVM內存區域

JVM中的內存區域分為多個部分,以存儲應用程序數據的特定部分。

  • 方法區:存儲類結構,例如類的基本信息,常量運行時池和方法代碼。
  • 堆:存儲在應用程序執行期間創建的所有對象。
  • 棧:存儲局部變量和中間結果。所有這些變量對於創建它們的線程都是私有的。每個線程都有自己的JVM棧,並在創建線程時同時創建。因此,所有此類局部變量都稱為線程局部變量。
  • PC寄存器:存儲當前正在執行的語句的物理內存地址。在Java中,每個線程都有其單獨的PC寄存器。
  • 本地方法區:許多底層代碼都是用C和C ++等語言編寫的。本地方法棧保存本機代碼的指令。

JVM執行引擎

分配給JVM的所有代碼均由執行引擎執行。執行引擎讀取字節碼並一一執行。它使用兩個內置的解釋器和JIT編譯器將字節碼轉換為機器碼並執行。

https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/java/java14.png

使用JVM,解釋器和編譯器均會生成本機代碼。不同之處在於它們如何生成本機代碼,其優化程度以及優化成本。

解釋器

JVM解釋器通過查找預定義的JVM指令到機器指令的映射,幾乎將每個字節碼指令轉換為相應的本機指令。它直接執行字節碼,不執行任何優化。

JIT編譯器

為了提高性能,JIT編譯器在運行時與JVM交互,並將適當的字節碼序列編譯為本地機器代碼。通常,JIT編譯器采用一段代碼(和解釋器一次一條語句不一樣),優化代碼,然后將其轉換為優化的機器代碼。

默認情況下,JIT編譯器處於啟用狀態。您可以禁用JIT編譯器,在這種情況下,解釋器將要解釋整個Java程序。除了診斷或解決JIT編譯問題外,不建議禁用JIT編譯器。

什么是JRE

Java運行時環境(JRE)是一個軟件包,它將庫(jar)和Java虛擬機以及其他組件捆綁在一起,以運行用Java編寫的應用程序。JRE只是JVM的一部分。

要執行Java應用程序,只需要在計算機中安裝JRE。 這是在計算機上執行Java應用程序都是最低要求。

JRE包含了以下組件–

  1. Java HotSpot客戶端虛擬機使用的DLL文件。
  2. Java HotSpot服務器虛擬機使用的DLL文件。
  3. Java運行時環境使用的代碼庫,屬性設置和資源文件。例如rt.jar和charsets.jar。
  4. Java擴展文件,例如localedata.jar。
  5. 包含用於安全管理的文件。這些文件包括安全策略(java.policy)和安全屬性(java.security)文件。
  6. 包含applet支持類的Jar文件。
  7. 包含供平台使用的TrueType字體文件。

JRE可以作為JDK的一部分下載,也可以單獨下載。JRE與平台有關。您可以根據您的計算機的類型(操作系統和體系結構)選擇要導入和安裝的JRE軟件包。

比如,你不能在32位計算機上安裝64JRE。同樣,用於WindowsJRE發行版在Linux上將無法運行。反之亦然。

什么是JDK

JDKJRE更加全面。JDK包含JRE擁有的所有部門以及用於開發,調試和監視Java應用程序的開發工具。當需要開發Java應用程序時,需要JDK

JDK附帶的幾個重要組件如下:

  • appletviewer –此工具可用於在沒有Web瀏覽器的情況下運行和調試Java applet
  • apt –注釋處理工具
  • extcheck –一種檢測JAR文件沖突的實用程序
  • javadoc –文檔生成器,可從源代碼注釋自動生成文檔
  • jar –存檔程序,它將相關的類庫打包到一個JAR文件中。該工具還有助於管理JAR文件
  • jarsigner – jar簽名和驗證工具javap –類文件反匯編程序
  • javaws – JNLP應用程序的Java Web Start啟動器
  • JConsole – Java監視和管理控制台
  • jhat – Java堆分析工具
  • jrunscript – Java命令行腳本外殼
  • jstack –打印Java線程的Java堆棧跟蹤的實用程序
  • keytool –用於操作密鑰庫的工具
  • policytool –策略創建和管理工具
  • xjc – XML綁定Java API(JAXB)API的一部分。它接受XML模式並生成Java類

JRE一樣,JDK也依賴於平台。因此,在為您的計算機下載JDK軟件包時請多加注意。

JDK,JRE和JVM之間的區別

基於以上討論,我們可以得出以下這三者之間的關系

JRE = JVM + libraries to run Java application.

JDK = JRE + tools to develop Java Application.

https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/java/java15.png

簡而言之,如果你是編寫代碼的Java應用程序開發人員,則需要在計算機中安裝JDK。但是,如果只想運行用Java內置的應用程序,則只需要在計算機上安裝JRE

JDK,JRE和JVM相關的面試問題

如果你理解我們在這篇文章中討論的內容,那么面對任何面試問題都不難。不過,還是要准備好回答如下問題:

什么是JVM架構

上面已經詳細解釋過了。

Java有幾種類型的類加載器

Bootstrap, extension、應用程序類加載器和自定義類加載器。

類加載器是如何在Java中工作的?

類加載器會在其預定義位置掃描jar文件和類。他們掃描路徑中的所有那些類文件,並查找所需的類。如果找到它們,則加載,鏈接並初始化類文件。

jre和jvm的區別?

JVM是用於運行Java應用程序的運行時環境的規范。Hotspot JVM是規范的這樣一種實現。它加載類文件,並使用解釋器和JIT編譯器將字節碼轉換為機器代碼並執行。

解釋器和jit編譯器的區別?

解釋器逐行解釋字節碼並順序執行。這會導致性能下降。JIT編譯器通過分析塊中的代碼來為該過程添加優化,然后准備更多優化的機器代碼。

JDK 和 JRE下載


https://niocoder.com/assets/images/qrcode.jpg

🙂🙂🙂關注微信公眾號java干貨
不定期分享干貨資料

原文鏈接:What is Java JDK, JRE and JVM – In-depth Analysis


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM