更新時(shí)間:2020-09-30 15:39:51 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2124次
JVM是我們學(xué)習(xí)Java接觸最多的名詞之一,那么JVM到底是什么呢?許多小伙伴對(duì)此都是一知半解,沒(méi)有從根本上弄懂JVM是什么。
想知道jvm是什么?那我們先來(lái)看看JVM的定義:JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的。
我們都知道在 Windows 系統(tǒng)上一個(gè)軟件包裝包是 exe 后綴的,而這個(gè)軟件包在蘋果的 Mac OSX 系統(tǒng)上是無(wú)法安裝的。類似地,Mac OSX 系統(tǒng)上軟件安裝包則是 dmg 后綴,同樣無(wú)法在 Windows 系統(tǒng)上安裝。
為什么不同系統(tǒng)上的軟件無(wú)法安裝,這是因?yàn)椴僮飨到y(tǒng)底層的實(shí)現(xiàn)是不一樣的。對(duì)于 Windows 系統(tǒng)來(lái)說(shuō),exe 后綴的軟件代碼最終編譯成 Windows 系統(tǒng)能識(shí)別的機(jī)器碼。而 Mac OSX 系統(tǒng)來(lái)說(shuō),dmg 后綴的軟件代碼最終編譯成 Mac OSX 系統(tǒng)能識(shí)別的代碼。
系統(tǒng)軟件無(wú)法通用是一個(gè)常見(jiàn)的問(wèn)題。但使用過(guò) Java 的同學(xué)都知道,Java 代碼可以在服務(wù)端(Linux 系統(tǒng))運(yùn)行,也可以在 Windows 系統(tǒng)運(yùn)行,但我們并沒(méi)有生成多份不同的代碼。所以 Java 語(yǔ)言是如何做到的呢?
與其他語(yǔ)言不同,Java 語(yǔ)言并不直接將代碼編譯成與系統(tǒng)有關(guān)的機(jī)器碼,而是編譯成一種特定的語(yǔ)言規(guī)范,這種語(yǔ)言規(guī)范我們稱之為字節(jié)碼。無(wú)論 Java 程序要在 Windows 系統(tǒng),還是 Mac OSX 系統(tǒng),抑或是 Linux 系統(tǒng),它首先都得編譯成字節(jié)碼文件,之后才能運(yùn)行。
但即使編譯成字節(jié)碼文件了,各個(gè)系統(tǒng)還是無(wú)法明白字節(jié)碼文件的內(nèi)容,這時(shí)候就需要 Java 虛擬機(jī)的幫助了。Java 虛擬機(jī)會(huì)解析字節(jié)碼文件的內(nèi)容,并將其翻譯為各操作系統(tǒng)能理解的機(jī)器碼。
簡(jiǎn)單地說(shuō),對(duì)于同樣一份 Java 源碼文件,我們編譯成字節(jié)碼之后,無(wú)論是 Linux 系統(tǒng)還是 Windows 系統(tǒng)都不認(rèn)識(shí)。這時(shí)候 Java 虛擬機(jī)就是一個(gè)翻譯官,在 Linux 系統(tǒng)上翻譯成 Linux 機(jī)器碼給 Linux 系統(tǒng)聽(tīng),在 Windows 系統(tǒng)上翻譯成 Windows 機(jī)器碼給 Windows 系統(tǒng)聽(tīng)。這樣一來(lái),Java 就實(shí)現(xiàn)了「Write Once,Run Anywhere」的偉大愿景了。
在 Java 虛擬機(jī)還沒(méi)出現(xiàn)之前,為了支持軟件在不同系統(tǒng)上運(yùn)行,我們必須在多個(gè)平臺(tái)寫多份代碼,分別對(duì)應(yīng)特定的系統(tǒng)。但 Java 虛擬機(jī)出現(xiàn)之后,你只需要按照特定規(guī)范編譯書寫,編譯器編譯成字節(jié)碼文件后,虛擬機(jī)會(huì)幫你將字節(jié)碼生成對(duì)應(yīng)的 Windows Code 和 Mac Code。本質(zhì)上最終還是會(huì)生成 Windows Code 和 Mac Code 兩份機(jī)器代碼,但對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),卻只需要寫一次代碼了。Java 虛擬機(jī)幫開(kāi)發(fā)人員承擔(dān)了重復(fù)的工作,讓開(kāi)發(fā)效率更高了。
很多初學(xué)者關(guān)于 Java 虛擬機(jī)有一個(gè)誤區(qū),他們會(huì)覺(jué)得 Java 虛擬機(jī)只能運(yùn)行 Java 代碼。但實(shí)際上 Java 虛擬機(jī)運(yùn)行的是字節(jié)碼文件。換句話說(shuō),如果你用 php 語(yǔ)言寫一段代碼,并自己用特定編譯器能生成符合字節(jié)碼規(guī)范的字節(jié)碼文件,那么 Java 虛擬機(jī)也是可以運(yùn)行的。
所以雖然名字是 Java 虛擬機(jī),但 Java 虛擬機(jī)與 Java 語(yǔ)言沒(méi)有直接關(guān)系,它只按照 Java 虛擬機(jī)規(guī)范去讀取 Class 文件,并按照規(guī)定去解析、執(zhí)行字節(jié)碼指令,僅此而已。
當(dāng)然如果你夠優(yōu)秀,你完全可以寫一個(gè)編譯器,將 PHP 語(yǔ)言代碼編譯成符合 Java 虛擬機(jī)規(guī)范的字節(jié)碼文件,那么 Java 虛擬機(jī)也是可以執(zhí)行的。準(zhǔn)確地說(shuō),Java 虛擬機(jī)與字節(jié)碼文件(Class文件)綁定。
看完了本文,我們或多或少對(duì)JVM應(yīng)該有了自己的認(rèn)知,到底jvm是什么?其實(shí) Java 虛擬機(jī)就是一個(gè)字節(jié)碼翻譯器,它將字節(jié)碼文件翻譯成各個(gè)系統(tǒng)對(duì)應(yīng)的機(jī)器碼,確保字節(jié)碼文件能在各個(gè)系統(tǒng)正確運(yùn)行,僅此而已。對(duì)于JVM更加深入的講解在本站的Java基礎(chǔ)視頻教程中有著完美的體系,小伙伴們還不趕快行動(dòng),下載視頻教程,開(kāi)始學(xué)習(xí)Java基礎(chǔ)知識(shí)。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743