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