JVM基礎系列第3講:到底什么是虛擬機?
時間:2023-07-01 13:03:02 | 來源:網站運營
時間:2023-07-01 13:03:02 來源:網站運營
JVM基礎系列第3講:到底什么是虛擬機?:我們都知道在 Windows 系統(tǒng)上一個軟件包裝包是 exe 后綴的,而這個軟件包在蘋果的 Mac OSX 系統(tǒng)上是無法安裝的。類似地,Mac OSX 系統(tǒng)上軟件安裝包則是 dmg 后綴,同樣無法在 Windows 系統(tǒng)上安裝。
為什么不同系統(tǒng)上的軟件無法安裝,這是因為操作系統(tǒng)底層的實現(xiàn)是不一樣的。對于 Windows 系統(tǒng)來說,exe 后綴的軟件代碼最終編譯成 Windows 系統(tǒng)能識別的機器碼。而 Mac OSX 系統(tǒng)來說,dmg 后綴的軟件代碼最終編譯成 Mac OSX 系統(tǒng)能識別的代碼。
系統(tǒng)軟件無法通用是一個常見的問題。但使用過 Java 的同學都知道,Java 代碼可以在服務端(Linux 系統(tǒng))運行,也可以在 Windows 系統(tǒng)運行,但我們并沒有生成多份不同的代碼。所以 Java 語言是如何做到的呢?
與其他語言不同,Java 語言并不直接將代碼編譯成與系統(tǒng)有關的機器碼,而是編譯成一種特定的語言規(guī)范,這種語言規(guī)范我們稱之為字節(jié)碼。無論 Java 程序要在 Windows 系統(tǒng),還是 Mac OSX 系統(tǒng),抑或是 Linux 系統(tǒng),它首先都得編譯成字節(jié)碼文件,之后才能運行。
但即使編譯成字節(jié)碼文件了,各個系統(tǒng)還是無法明白字節(jié)碼文件的內容,這時候就需要 Java 虛擬機的幫助了。Java 虛擬機會解析字節(jié)碼文件的內容,并將其翻譯為各操作系統(tǒng)能理解的機器碼。
簡單地說,對于同樣一份 Java 源碼文件,我們編譯成字節(jié)碼之后,無論是 Linux 系統(tǒng)還是 Windows 系統(tǒng)都不認識。這時候 Java 虛擬機就是一個翻譯官,在 Linux 系統(tǒng)上翻譯成 Linux 機器碼給 Linux 系統(tǒng)聽,在 Windows 系統(tǒng)上翻譯成 Windows 機器碼給 Windows 系統(tǒng)聽。這樣一來,Java 就實現(xiàn)了「Write Once,Run Anywhere」的偉大愿景了。
在 Java 虛擬機還沒出現(xiàn)之前,為了支持軟件在不同系統(tǒng)上運行,我們必須在多個平臺寫多份代碼,分別對應特定的系統(tǒng)。但 Java 虛擬機出現(xiàn)之后,你只需要按照特定規(guī)范編譯書寫,編譯器編譯成字節(jié)碼文件后,虛擬機會幫你將字節(jié)碼生成對應的 Windows Code 和 Mac Code。本質上最終還是會生成 Windows Code 和 Mac Code 兩份機器代碼,但對于開發(fā)人員來說,卻只需要寫一次代碼了。Java 虛擬機幫開發(fā)人員承擔了重復的工作,讓開發(fā)效率更高了。
很多初學者關于 Java 虛擬機有一個誤區(qū),他們會覺得 Java 虛擬機只能運行 Java 代碼。*但實際上 Java 虛擬機運行的是字節(jié)碼文件。*換句話說,如果你用 php 語言寫一段代碼,并自己用特定編譯器能生成符合字節(jié)碼規(guī)范的字節(jié)碼文件,那么 Java 虛擬機也是可以運行的。
所以雖然名字是 Java 虛擬機,但 Java 虛擬機與 Java 語言沒有直接關系,它只按照 Java 虛擬機規(guī)范去讀取 Class 文件,并按照規(guī)定去解析、執(zhí)行字節(jié)碼指令,僅此而已。
如果你夠牛逼,你完全可以寫一個編譯器,將 PHP 語言代碼編譯成符合 Java 虛擬機規(guī)范的字節(jié)碼文件,那么 Java 虛擬機也是可以執(zhí)行的。
準確地說,Java 虛擬機與字節(jié)碼文件(Class文件)綁定。
最后,讓我們回顧一下,到底什么是虛擬機?其實 Java 虛擬機就是一個字節(jié)碼翻譯器,它將字節(jié)碼文件翻譯成各個系統(tǒng)對應的機器碼,確保字節(jié)碼文件能在各個系統(tǒng)正確運行。
參考資料
- https://www.javaworld.com/article/3272244/core-java/what-is-the-jvm-introducing-the-java-virtual-machine.html
- https://www.dummies.com/programming/java/what-is-a-java-virtual-machine/
一個人可以走得更快,但一群人可以走得更遠。歡迎加入博主的讀者交流群,獲取入群二維碼請
關注「架構師指南」回復「入群交流」獲取。群里有來自北上廣深的技術朋友,我們一同探討軟件開發(fā)的職業(yè)發(fā)展、日常生活、技術思維等。
JVM基礎系列文章目錄
- JVM基礎系列開篇:為什么要學虛擬機?
- JVM基礎系列第1講:Java 語言的前世今生
- JVM基礎系列第2講:Java 虛擬機的歷史
- JVM基礎系列第3講:到底什么是虛擬機?
- JVM基礎系列第4講:從源代碼到機器碼,發(fā)生了什么?
- JVM基礎系列第5講:字節(jié)碼文件結構
- JVM基礎系列第6講:Java虛擬機內存結構
- JVM基礎系列第7講:JVM類加載機制
- JVM基礎系列第8講:JVM 垃圾回收機制
- JVM基礎系列第9講:JVM垃圾回收器
- JVM基礎系列第10講:垃圾回收的幾種類型
- JVM基礎系列第11講:JVM參數(shù)之堆??臻g配置
- JVM基礎系列第12講:JVM參數(shù)之查看JVM參數(shù)
- JVM基礎系列第13講:JVM參數(shù)之追蹤類信息
- JVM基礎系列第14講:JVM參數(shù)之GC日志配置
- JVM基礎系列第15講:JDK性能監(jiān)控命令