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

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

概述

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

Java程序執行過程

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

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

什么是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架構

類加載器

類加載器是用于加載類文件到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編譯器將字節碼轉換為機器碼并執行。

使用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.

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

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

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

什么是JVM架構

上面已經詳細解釋過了。

Java有幾種類型的類加載器

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

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

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

jre和jvm的區別?

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

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

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

JDK 和 JRE下載


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

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

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容