JVM 介紹
1. 前言
本節內容主要是介紹 JVM 的定義、意義以及虛擬機的發展歷程,是本套課程的基礎知識部分,也是我們初次握手JVM 的章節。本節主要知識點如下:
-
了解 JVM 的定義,這是我們了解 JVM 概念的基礎,為本節的重點之一;
-
了解 JVM 存在的價值及意義,從使用層面了解 JVM 存在的意義,也是本節課程的重點內容;
-
了解 JVM 整體結構,該結構圖是從宏觀層面,介紹的虛擬機的整體結構模塊,后續會對每個模塊進行細致的介紹與講解,此處可視作了解內容,為后續內容的學習奠定基礎;
-
了解如何查看自己所使用的 JVM 版本,安裝完成 JDK 的學習者,都可以進行查看;
-
了解 JVM ,JRE 和 JDK 三者直接的區別,這是學習 JVM 前需要掌握的基礎知識。
本節內容是我們初次了解 JVM,從概念的角度去了解 JVM,為我們后續章節內容的學習打下了良好的基礎。
2. JVM 定義
定義: JVM (Java Virtual Machine 簡稱 JVM),亦可稱之為 Java 虛擬機。它是運行所有 Java 程序的抽象計算機,是 Java 語言的運行環境,它是 Java 最具吸引力的特性之一。
虛擬機:從字面意義上來理解,虛擬機是一個虛擬化出來的計算機。
舉個例子:我們經常在 Windows 操作系統上安裝 Linux 的虛擬機,然后在 Linux 虛擬機上進行 Shell 腳本的編寫練習,那么從這個角度上來說, Linux 虛擬機就類似于 JVM ,不同的是 Linux 虛擬機支撐了 Shell 腳本的運行環境,而 JVM 支撐了 Java 語言的運行。
JVM 是一種抽象化的計算機,通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java 虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。Java 虛擬機屏蔽了與具體操作系統平臺相關的信息,使得 Java 程序只需生成在 Java 虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。
3. JVM 的作用
JVM 是 Java 語言的一大關鍵亮點,對于 JVM 的作用,我們這里介紹兩個主要的作用,來體現 JVM 的價值所在。
-
跨平臺性:Java 語言之所以有跨平臺的優點,完全是 JVM 的功勞,跨平臺性是 JVM 存在的最大的亮點。
以上一個知識點部分所舉出例子來說,Windows 操作系統安裝上 JVM 之后,可以支持 Java 程序的運行; Linux 操作系統安裝上 JVM 之后,可以支持 Java 程序的運行;同理,Unix 操作系統等等所有我們熟悉的操作系統,安裝上 JVM 之后,都可以支持 Java 程序的運行。
這大大提升了 Java 語言的平臺靈活性,能夠在眾多語言爭鳴的時代,脫穎而出。
-
優秀的垃圾回收機制: Java 語言的誕生,極大的降低了軟件開發人員的學習難度,除了 Java 面向對象編程的特性能夠降低學習難度以外,還有一個比較重要的點,就是在進行 Java 編程的時候,可以更少的去考慮垃圾回收機制。
學習過 C 語言的技術人員都能夠體會這一點,因為 C 語言編程過程中,要通過代碼手動實現內存垃圾的回收與空間釋放,這提升了編程的難度,因為考慮內存空間釋放,更多的會涉及到底層的知識,這是非常高的一個門檻。從 JVM 的角度來說,JVM 擁有自己的垃圾回收機制,為開發人員分擔了部分工作。
Tips:JVM 在 Java 語言中占據了非常重要的地位,學習 JVM 是 Java 技術人員必須要做的事情,目前企業對于 Java 從業者對 JVM 的掌握程度要求非常高,是重點學習內容。
4. 查看自己的 JVM
我們知道,如果需要運行 Java 程序,必須要安裝 JDK,這說明 JDK 中就包含了支持 Java 語言運行的JVM ,我們來看下如何查看本機的 JVM 信息。
無論是 Windows 操作系統還是 Linux 操作系統,正確安裝 JDK 并且配置好環境變量后,在命令行輸入如下命令進行查看:
java -version
以本人的機器為例,可以看到如下的執行結果:
C:\Users\Wayne.WangTJ>java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
我們仔細看下最后一句執行結果,Java HotSpot? 64-Bit Server VM (build 25.191-b12, mixed mode),這就是我的電腦中 Jvm 虛擬機操作系統的版本。 當然了,安裝不同的版本,結果是有所區別的。
5. JVM,JRE 和 JDK 聯系
三者的定義:我們先來明確下三者的定義,然后說明三者的聯系與區別。
- JDK:全稱 java development kit ,開發工具包,面向我們的開發者,為開發者提供開發類庫,他是 java 的核心。JDK 包含了JRE,一堆工具類(javac、java)以及 Java 的基礎類庫(Object,string);
- JRE:全稱 java runtime environment。包含了JVM 實現和需要的類庫。JRE 是一個運行環境,并非開發工具;
- JVM:它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。JVM 有自己完善的硬件架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。Java 語言最重要的特點就是跨平臺運行。使用 JVM 就是為了實現跨平臺。
如下圖所示,我們可以看到 JDK 包含 JRE,JRE 包含 JVM,我們繼續來看下邊的講解,徹底了解三者之間的聯系與區別。
三者的區別:
- JDK 和 JRE 的區別: JDK 是開發工具包,包含了JRE;JRE 是運行環境,不提供開發工具包。
- JRE 和 JVM 的區別: JRE 包含了JVM,JRE=JVM+lib。JRE 為 class 文件提供了運行的環境,但是需要 JVM 進行 class 文件的翻譯,JVM 將翻譯好的文件傳給 os 系統或者是 CPU 映射指令集,才能夠最終完成運行。
三者的聯系:三者互相配合不可分割。
JVM 不能夠單獨的搞定 class 文件,解釋 class 的時候,JVM (安裝路徑\Java\jre1.8.0_144\bin)需要調用我們所需要的類庫(安裝路徑\Java\jre1.8.0_144\lib)。籠統的來說,JVM + lib = JRE。而 JDK 是基于 JRE 基礎之上進行的。
總體來說,我們利用 JDK 開發了屬于我們自己的程序,通過 JDK 的 javac 工具包進行了編譯,將 Java 文件編譯成為了 class 文件(字節碼文件),在 JRE 上運行這些文件的時候,JVM 進行了這些文件(字節碼文件)的翻譯,翻譯給操作系統,映射到 CPU 指令集或者是操作系統調用,最終完成了我們的代碼程序的順利運行。
6. 小結
本節課程主要是對 JVM 的定義以及作用進行一個簡單的介紹,通過對 JVM 的整體結構進行描述,使我們了解了 JVM 的基本情況,為后續的學習奠定良好的基礎。