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