<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 什么是 Java JDK,JRE 和 JVM – 深入分析 > 原文: [https://howtodoinjava.com/java/basics/jdk-jre-jvm/](https://howtodoinjava.com/java/basics/jdk-jre-jvm/) 了解 JDK,JRE 和 JVM 之間的區別。 JVM 是如何工作的? 什么是**類加載器**,**解釋器**和 **JIT 編譯器**。 還要簽出一些**面試問題**。 ```java Table of Contents 1\. Execution of a Java Program 2\. What is JVM? 3\. What is JRE? 4\. What is JDK? 5\. Differences between JDK, JRE and JVM 6\. Interview questions related to JDK, JRE and JVM 7\. JDK and JRE downloads ``` ## 1\. 執行 Java 程序 在深入了解 Java 內部之前,讓我們了解如何執行 Java 源文件。 1. 我們使用編輯器或 IDE(**集成開發環境**)在`Simple.Java`文件中編寫 Java 源代碼。 *Eclipse* 或 *IntelliJ Idea* 。 2. 程序必須編譯成字節碼。 Java 編譯器(`javac`)將源代碼編譯為`Simple.class`文件。 3. JVM(**Java 虛擬機**)可以在任何平臺/操作系統中執行此類文件。 4. JVM 將字節碼轉換為機器可執行的本機機器代碼。 ![Java Execution Flow](https://img.kancloud.cn/6e/0f/6e0fde234467d0781bc2e05a43335240_959x359.png) Java 執行流程 ## 2\. 什么是 JVM? **Java 虛擬機**(JVM)是??運行 Java 字節碼的虛擬機。 您可以通過將`.java`文件編譯為`.class`文件來獲得此字節碼。 `.class`文件包含 JVM 可以理解的字節碼。 在現實世界中,JVM 是提供可在其中執行 Java 字節碼的運行時環境的規范。 不同的供應商提供此規范的不同實現。 例如,此 Wiki 頁面列出了[不同的 JVM 實現](https://en.wikipedia.org/wiki/List_of_Java_virtual_machines)。 JVM 最流行的實現是 [Hotspot](https://www.oracle.com/technetwork/java/javase/tech/index-jsp-136373.html) ,它由 Oracle Corporation 擁有和提供。 (*先前由 Sun Microsystems,Inc.* )。 JVM 使用許多先進技術為 Java 應用程序提供最佳性能,這些技術結合了最新的內存模型,**垃圾收集器**和**自適應優化器**。 JVM 具有兩種不同的風格-**客戶端**和**服務器**。 盡管服務器 VM 和客戶端 VM 相似,但已經對服務器 VM 進行了特殊調整,以最大程度地提高峰值運行速度。 它用于執行長時間運行的服務器應用程序,這些應用程序需要比快速啟動時間或較小的運行時內存占用更多??的最快的運行速度。 開發人員可以通過指定`-client`或`-server`選擇他們想要的系統。 JVM 之所以稱為**虛擬**,是因為它提供的機器接口不依賴于底層操作系統和機器硬件架構。 這種與硬件和操作系統的獨立性是 Java 程序一次寫入,隨處運行的價值的基石。 #### 2.1 JVM 架構 ![JVM Architecture](https://img.kancloud.cn/dd/70/dd7019995ef46c429a814d42dce57882_731x477.png) JVM 架構 ##### 2.1.1 類加載器 類加載器是用于加載類文件的子系統。 它執行三個主要功能,即類加載,鏈接和初始化。 1. ##### 載入 * 為了加載類,JVM 有 3 種類加載器。 **引導程序**,**擴展名**和**應用程序**類加載器。 * 加載類文件時,JVM 會發現某個任意類`XYZ.class` 的依賴項。 * 第一個引導程序類加載器嘗試查找該類。 它將掃描 JRE `lib`文件夾中的`rt.jar`文件。 * 如果找不到類,那么擴展類加載器會在`jre\lib\ext`文件夾中搜索類文件。 * 同樣,如果未找到類,則應用程序類加載器將在系統的`CLASSPATH`環境變量中搜索所有 Jar 文件和類。 * 如果任何加載程序找到了類,則由類加載程序加載類; 否則拋出`ClassNotFoundException`。 2. ##### 鏈接 由類加載器加載類后,將執行鏈接。 **字節碼驗證器**將驗證生成的字節碼是否正確,如果驗證失敗,我們將收到驗證錯誤。 它還對類中的靜態變量和方法執行內存分配。 3. ##### 初始化 這是類加載的最后階段,此處將為所有靜態變量分配原始值,并執行靜態塊。 ##### 2.1.2 JVM 內存區域 JVM 中的內存區域分為多個部分,以存儲應用程序數據的特定部分。 * **方法區**,用于存儲類結構,如元數據,常量運行時池和方法代碼。 * **堆**存儲在應用程序執行期間創建的所有對象。 * **棧**存儲局部變量和中間結果。 所有這些變量對于創建它們的線程都是本地的。 每個線程都有自己的 JVM 棧,并在創建線程時同時創建。 因此,所有此類局部變量都稱為**線程局部變量**。 * **PC 寄存器**存儲當前正在執行的語句的物理內存地址。 在 Java 中,每個線程都有其單獨的 PC 寄存器。 * Java 也支持并使用**本機代碼**。 許多底層代碼都是用 C 和 C++ 等語言編寫的。 本機方法棧保存本機代碼的指令。 #### 2.2 JVM 執行引擎 分配給 JVM 的所有代碼均由**執行引擎**執行。 執行引擎讀取字節碼并一一執行。 它使用兩個內置的*解釋器*和 *JIT 編譯器* **將字節碼轉換為機器代碼并執行**。 ![Platform Specific Interpreters](https://img.kancloud.cn/db/c0/dbc0314d97162b40c7378364cddc1d4f_447x168.png) 平臺特定的解釋器 使用 JVM,解釋器和編譯器均會生成本機代碼。 不同之處在于它們如何生成本機代碼,其優化程度以及優化的代價。 #### 2.2.1 解釋器 JVM 解釋器通過查找預定義的 JVM 指令到機器指令的映射,幾乎將每個字節碼指令轉換為相應的本機指令。 它**直接**執行字節碼,并且不執行任何優化。 #### 2.2.2 JIT 編譯器 **為了提高性能**,JIT 編譯器在運行時與 JVM 交互,并將適當的字節碼序列編譯為本地機器代碼。 通常,JIT 編譯器采用一段代碼(每次一次都沒有一個語句作為解釋器),優化代碼,然后將其轉換為優化的機器代碼。 默認情況下啟用 **JIT 編譯器**。 您可以禁用 JIT 編譯器,在這種情況下,將解釋整個 Java 程序。 除了診斷或解決 JIT 編譯問題外,不建議禁用 JIT 編譯器。 ## 3\. 什么是 JRE? **Java 運行時環境**(JRE)是一個包,它將庫(jar)和 Java 虛擬機以及其他組件捆綁在一起,以運行用 Java 編寫的應用程序。 JVM 只是 JRE 發行版的一部分。 要執行任何 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. 包含**小程序**的支持類的 Jar 文件。 7. 包含 **TrueType 字體文件**供平臺使用。 JRE 可以作為 JDK 的一部分下載,也可以單獨下載。 JRE 與平臺有關。 這意味著您必須根據計算機的類型(操作系統和架構)選擇要導入和安裝的 JRE 包。 例如,您不能在`32-bit`計算機上安裝`64-bit` JRE 發行版。 同樣, *Windows* 的 JRE 分發在 *Linux* 中將不起作用; 反之亦然。 ## 4\. 什么是 JDK? **JDK 是 JRE** 的超集。 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 包時請多加注意。 ## 5\. JDK,JRE 和 JVM 之間的區別 基于以上討論,我們可以得出以下三個方面的關系: > JRE = JVM + 運行 Java 應用程序的庫。 > > JDK = JRE + 開發 Java 應用程序的工具。 ![JDK vs JRE vs JVM](https://img.kancloud.cn/04/70/0470afdc653fb726d2b040cc17472773_544x439.png) JDK vs JRE vs JVM 簡而言之,如果您是編寫代碼的 Java 應用程序開發人員,則需要在計算機中安裝 JDK。 但是,如果只想運行用 Java 內置的應用程序,則只需要在計算機上安裝 JRE。 ## 6\. 與 JDK,JRE 和 JVM 有關的面試問題 如果您了解我們到目前為止在本文中討論的內容,那么面對任何面試問題都將很困難。 盡管如此,請準備回答以下問題: 1. #### 什么是 JVM 架構? 已經詳細解釋了。 2. #### Java 中有幾種類型的類加載器? 有 3 種裝載機。 引導程序,擴展程序和應用程序類加載器。 3. #### Java 中的類加載器如何工作? 類加載器會在其預定義位置掃描 jar 文件和類。 他們掃描路徑中的所有那些類文件,并查找所需的類。 如果找到它們,請加載,鏈接并初始化類文件。 4. #### JRE 和 JVM 之間的區別? JVM 是用于運行 Java 應用程序的運行時環境的規范。 熱點 JVM 是規范的這樣一種實現。 它加載類文件,并使用解釋器和 JIT 編譯器將字節碼轉換為機器代碼并執行。 5. #### 解釋器和 JIT 編譯器之間的區別? 解釋器逐行解釋字節碼并順序執行。 這會導致性能下降。 JIT 編譯器通過分析塊中的代碼來為該過程添加優化,然后準備更多優化的機器代碼。 ## 7\. JDK 和 JRE 下載 您可以在 Oracle 的 Java 發行頁面中找到特定于平臺的 JDK 和 JRE 包。 例如,此[頁](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)列出了 Java 8 的所有可用 JDK 發行版。 ![JDK 8 Distributions](https://img.kancloud.cn/5d/01/5d015ce5b527e5062fb9d501baf61896_551x296.png) JDK 8 發行版 類似地,[此頁](http://www.oracle.com/technetwork/java/javase/downloads/server-jre8-downloads-2133154.html)中提供了 JRE 8 發行版。 ![JRE 8 Distributions](https://img.kancloud.cn/dc/46/dc46256a497c4352827ae2a82b6ae3f9_546x342.png) JRE 8 發行版 學習愉快! 進一步閱讀: [JIT 編譯器如何優化代碼](https://www.ibm.com/support/knowledgecenter/en/SSYKE2_8.0.0/com.ibm.java.vm.80.doc/docs/jit_optimize.html) [JIT 編譯](https://en.wikipedia.org/wiki/Just-in-time_compilation) [了解 JIT 編譯器](https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/) [JDK 和 JRE 文件結構](https://docs.oracle.com/javase/6/docs/technotes/tools/windows/jdkfiles.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看