天天看點

JVM筆記-Java技術體系與JVM概述

Java 不僅僅是一門程式設計語言,還是一個由一系列計算機軟體和規範組成的技術體系。

Java 的廣告詞為 "一次編寫,到處運作",之是以能夠做到"跨平台",是因為每個平台上不同的虛拟機屏蔽了硬體的差異,而 Java 程式則是運作在虛拟機之上的。

本文簡要介紹 Java 技術體系及 Java 虛拟機(Java Virtual Machine, JVM)的相關發展曆程,後文再進一步分析 Java 虛拟機的詳細内容。

PS: 本文及接下來的 JVM 筆記内容主要來自周志明《深入了解 Java 虛拟機(第3版)》。

廣義上講,Kotlin、Groovy、JRuby 等運作于 Java 虛拟機上的程式設計語言及其相關程式都屬于 Java 技術體系。

而從傳統意義上來看,JCP 官方定義的 Java 技術體系主要包括:

Java 程式設計語言

各種硬體平台上的 Java 虛拟機

Class 檔案格式

Java 類庫 API

商業機構和開源社群的第三方 Java 類庫

其中 Java 程式設計語言、Java 虛拟機、Java 類庫三部分統稱為 JDK(Java Development Kit),JDK 是支援 Java 程式開發的最小環境。

Java 類庫 API 中的 Java SE API 子集和 Java 虛拟機統稱為 JRE(Java Runtime Environment),JRE 是支援 Java 程式運作的标準環境。

PS: JCP 全稱 Java Community Process,即 Java 社群,由業界多家技術巨頭組成的社群,用于定義和發展 Java 的技術規範。

Java 技術體系包含的内容如下:

JVM筆記-Java技術體系與JVM概述

"Java 虛拟機" 隻是一個概念,它的實作産品衆多,下面簡要介紹其發展曆程。

Class VM (JDK 1.0)

世界上第一款商用 Java 虛拟機

純解釋器方式執行 Java 代碼

對象查找基于句柄

Exact VM (JDK 1.2)

準确式記憶體管理:虛拟機可以知道記憶體中某個位置的資料具體類型

Sun/OracleJDK 和 OpenJDK 中預設虛拟機

目前使用範圍最廣的 Java 虛拟機

由于 HotSpot 虛拟機是目前使用最廣泛的,而且是目前 OracleJDK 和 OpenJDK 的預設虛拟機,後文的内容分析主要是針對該虛拟機。

終端執行 java -version 指令如下(不同機器會有所不同,此處僅供參考):

這裡的 HotSpot(TM) 64-Bit Server VM 指的就是 HotSpot 虛拟機。

Java ME 虛拟機

這兩個虛拟機曾與 HotSpot 虛拟機并稱"三大商業 Java 虛拟機"。

JRockit

專注于服務端應用

不含解釋器,全部代碼都由即時編譯器編譯後執行

J9 VM

職責分離與子產品化優于 HotSpot VM

與特定硬體平台綁定、軟硬體配合的專有虛拟機

這兩者是 "虛拟機",而非 "Java 虛拟機"。

Harmony VM

未通過 TCK 認證

未大規模商用

Dalvik VM

未遵循《Java 虛拟機規範》

不能直接執行 Java 的 Class 檔案

曾經是 Windows 系統下性能最好的 Java 虛拟機

KVM:曾在手機平台上得到廣泛應用

Java Card VM

……

其他還有很多各種各樣的虛拟機,不再一一列舉。值得注意的是一個比較新的 Java 虛拟機:Graal VM。

2018 年 4 月,Oracle Labs 公開的黑科技:Graal VM。

Graal VM 被官方稱為"Universal VM"和"Polyglot VM",它是在 HotSpot 虛拟機基礎上增強而成的跨語言全棧虛拟機。可作為"任何語言"的運作平台,包括:

Java、Scala、Groovy、Kotlin 等基于 Java 虛拟機之上的語言

C、C++、Rust 等基于 LLVM 的語言,同時支援 JavaScript、Ruby、Python 等

如圖所示:

JVM筆記-Java技術體系與JVM概述

而且自 JDK 10 起,HotSpot 中又加入了一個全新的即時編譯器:Graal 編譯器。

如若将來某一天 HotSpot 虛拟機真的被替換,Graal VM 很有可能"上位"。

本文主要介紹了 Java 技術體系和 Java 虛拟機的發展曆程,該部分内容了解即可,後文再分析虛拟機的主要内容。

為便于回顧和總結,這裡将上述内容整理成了思維導圖:

JVM筆記-Java技術體系與JVM概述
JVM筆記-Java技術體系與JVM概述

PS: 本文首發于微信公衆号【WriteOnRead】。