1. 程式人生 > 其它 >JVM簡明筆記1:JVM 概述

JVM簡明筆記1:JVM 概述

什麼是JVM

JVM 即 Java Virtual Machine,中文名為 Java虛擬機器。

一般情況下

  • C/C++ 程式,編譯成二進位制檔案後,就可以直接執行了;
  • Java 需要使用 javac 編譯成 .class 檔案,還需要使用 Java 命令去主動執行它。JVM 就是識別 .class 字尾的檔案,並且能夠解析它的指令,最終呼叫作業系統上的函式。

Java 是一門抽象程度特別高的語言,提供了自動記憶體管理等一系列的特性。這些特性直接在作業系統上實現是不太可能的。而且有了 JVM 這個抽象層之後,Java 就可以實現跨平臺了。Java 跨平臺的意義在於一次編譯,處處執行。而C/C++程式則需要對應不同的平臺、架構分別編譯成二進位制檔案。 現在的一些 JVM 的擴充套件語言,比如 Clojure、JRuby、Groovy 等,編譯到最後都是 .class

檔案,Java 語言的維護者,只需要控制好 JVM 這個解析器,就可以將這些擴充套件語言無縫的執行在 JVM 之上了。

從官網擷取幾張圖來理解 JVM:

JVM JRE JDK的關係

JVM不能單獨搞定 class 的執行,它還需要一個基本的類庫,比如怎麼操作檔案、怎麼連線網路等。JVM加上這些基礎類庫,就組成
了 Java 的執行時環境,也就是我們常說的 JRE(Java Runtime Environment)。

另外Java的開發者非常慷慨的實現了一些開發的工具,比如 javac、java、jar 等,是 Java 開發的核心。JRE加上這些工具就組成了 JDK(Java Development Kit))。

JVM 分塊概述

  • 執行時資料區 (Runtime Data Areas):分為五大區域,方法區(Method Area)、堆(Heap)、虛擬機器棧(Virtual Machine Stacks)、程式暫存器(Program Counter Registers)、本地方法棧(Native Method Stacks)
  • 類載入器 (ClassLoader):負責載入程式中的類和介面
  • 執行引擎 (Execution Engine):通過類裝載器裝載的,被分配到JVM的執行時資料區的位元組碼會被執行引擎執行
  • 垃圾收集 (Garbage Collect): 自動管理記憶體並進行垃圾回收

JVM 的不同實現

廣義上來講,JVM 是一種規範,Java發展的過程中產生了很多 VM 實現,我們現在最常用的 HotSpot VM。

下面表格是目前常見的 JVM 實現

虛擬機器名稱 介紹
HotSpot Oracle JDK和OpenJDK都使用HotSpot VM的相同核心
JRockit JRockit 也屬 Oracle,目前為止 Oracle 一直在推進與 HotSpot 融合互補(大致上是在HotSpot的基礎上,移植JRockit的優秀特性)
Azul Zulu 由Azul Systems根據HostPot為基礎改進的高效能低延遲的JVM(最初針對專有硬體Vega系統,2010年釋出了Zing VM面向通用x86平臺)
OpenJ9 是IBM開發的高度模組化的JVM,目前已經捐獻給Eclipse基金會
GraalVM 基於HotSpot / OpenJDK,它具有多語言功能,可以透明地混合和匹配支援的語言。

更多的JVM實現方案請檢視 List of Java virtual machines - Wikipedia