【譯】JVM是什么?介紹Java虛擬機(jī)

JavaWorld

原文鏈接:https://www.javaworld.com/article/3272244/core-java/what-is-the-jvm-introducing-the-java-virtual-machine.html

Java虛擬機(jī)是一個(gè)執(zhí)行其他程序的程序。這是一個(gè)簡(jiǎn)單的想法,但這也是最偉大的編程想法之一。它打破了當(dāng)時(shí)的編程技術(shù)狀況,直到今日,仍然支持著程序設(shè)計(jì)上的革新。

JVM(Java Virtual Machine)的用途和定義

JVM有兩個(gè)主要功能:允許Java程序運(yùn)行在任何設(shè)備或操作系統(tǒng)(即“一次編寫,到處運(yùn)行”原則),以及管理和優(yōu)化程序內(nèi)存。Java在1995年發(fā)行時(shí),所有的計(jì)算機(jī)程序都面向特定的操作系統(tǒng)編寫,并且程序的內(nèi)存由軟件開發(fā)者管理。因此,JVM的誕生對(duì)于開發(fā)者是一個(gè)啟示。

俯瞰JVM

有一個(gè)對(duì)JVM的專業(yè)定義是很有用的,同時(shí)在軟件開發(fā)者的思考中,它也有日?;母拍?。讓我們做如下定義:

? ?專業(yè)方面:JVM制定了程序執(zhí)行代碼的規(guī)范,并且提供程序運(yùn)行時(shí)的環(huán)境。

? ?日常方面:JVM就是我們運(yùn)行Java程序的方式。我們配置JVM,然后依賴它在程序執(zhí)行期間管理資源。

開發(fā)者們?cè)谡劦絁VM時(shí),通常我們談的是運(yùn)行在機(jī)器上尤其是服務(wù)器上的進(jìn)程,這代表和控制了Java應(yīng)用的資源分配。與之相比,JVM規(guī)范的概念描述的是構(gòu)建一個(gè)執(zhí)行這些任務(wù)的程序需要多少資源。

JVM由誰開發(fā)與維護(hù)?

JVM由一些非常聰明的開發(fā)者,聯(lián)合企業(yè)與開源社區(qū)廣泛地部署、使用和維護(hù)。OpenJDK是Sun微系統(tǒng)公司決定將Java開源的產(chǎn)物,現(xiàn)在由Oracle的Java團(tuán)隊(duì)管理,近些年大多數(shù)Java的重量級(jí)提升都由Oracle工程師們完成。

JVM內(nèi)存管理

一個(gè)運(yùn)行的JVM中最常見的交互作用是檢查堆和棧中的內(nèi)存使用情況,最頻繁的調(diào)整是對(duì)JVM內(nèi)存調(diào)度的調(diào)整。

垃圾收集

在Java之前,所有程序的內(nèi)存都由程序員管理,在Java中,JVM接管了這一工作。JVM通過一個(gè)叫做垃圾收集的進(jìn)程來管理內(nèi)存,它持續(xù)地識(shí)別出并清除掉Java程序中不再被使用內(nèi)存。垃圾收集發(fā)生在一個(gè)運(yùn)行的JVM中。

早期Java遭到很多批評(píng),因?yàn)樗幌馛++那么接近底層,因此速度不快。尤其是垃圾收集備受爭(zhēng)議。自那時(shí)起,各種算法和探討被提出和應(yīng)用到垃圾收集上。經(jīng)過持續(xù)的發(fā)展和優(yōu)化,垃圾收集的效率已經(jīng)被大大提升。

“ 接近底層 ”意味著什么?

當(dāng)程序員說一門編程語言或平臺(tái)“ 接近底層 ”,意思是指開發(fā)者可以以編碼的形式管理操作系統(tǒng)的內(nèi)存。理論上,程序員可以通過規(guī)定多少內(nèi)存被使用以及什么時(shí)候銷毀它而編寫出更高性能的程序。大多數(shù)情況下,將內(nèi)存管理工作委托給像JVM這樣更高層的進(jìn)程產(chǎn)生了更高的開發(fā)效率,并且相比自己管理更不容易出錯(cuò)。

JVM三大部分

可以說JVM擁有三個(gè)層面:規(guī)范、實(shí)現(xiàn)、和實(shí)例。讓我們一一探討。

1.JVM規(guī)范

首先,JVM是一個(gè)軟件規(guī)范。為了使它的實(shí)現(xiàn)發(fā)揮盡可能大的創(chuàng)造力,JVM規(guī)范用一種有點(diǎn)寫意的方式指明它的實(shí)現(xiàn)細(xì)節(jié)并不包含在規(guī)范內(nèi):

“想要正確地實(shí)現(xiàn)Java虛擬機(jī),你只需要閱讀類文件設(shè)計(jì)并且正確地執(zhí)行里面所指定的操作即可?!?/p>

類似地,音樂家巴赫曾經(jīng)這樣描述創(chuàng)造音樂:

“你所需要去做的只是在正確地時(shí)間按下正確的琴鍵?!?/p>

因此,JVM所需要去做的就是使Java程序正確地運(yùn)行。聽起來很簡(jiǎn)單,也許從外部看起來確實(shí)很簡(jiǎn)單,但實(shí)際上這是一項(xiàng)大的工程,尤其是你還要賦予給Java語言強(qiáng)大的功能和靈活性。

作為一個(gè)虛擬機(jī)的 JVM

JVM是一個(gè)以便捷的方式運(yùn)行Java類文件的虛擬機(jī)。作為一個(gè)虛擬機(jī)意味著JVM是底層的實(shí)際機(jī)器的抽象,比如你程序正運(yùn)行之上的這些服務(wù)器。無論運(yùn)行在什么操作系統(tǒng)或硬件,JVM都創(chuàng)造出了一個(gè)可預(yù)知的環(huán)境供程序穩(wěn)定運(yùn)行。但和真正的虛擬機(jī)不同的是,JVM并沒有創(chuàng)建出一個(gè)虛擬的操作系統(tǒng)。把JVM描述為一個(gè)托管的運(yùn)行時(shí)環(huán)境或是一個(gè)加工過的虛擬機(jī)更為貼切。

2.JVM實(shí)現(xiàn)

實(shí)施JVM的規(guī)范開發(fā)出一個(gè)真實(shí)的軟件程序,我們稱之為JVM實(shí)現(xiàn)。事實(shí)上,目前已經(jīng)有很多JVM實(shí)現(xiàn),開源閉源的都有。OpenJDK的HotSpot是一個(gè)作為參考的實(shí)現(xiàn),它保留著全世界最全面的嘗試和測(cè)試代碼庫。HotSpot同時(shí)也是最普遍使用的JVM。

幾乎所有獲得許可的JVM都是從OpenJDK和HotSpot JVM衍生而來,包括Oracle發(fā)行的JDK。開發(fā)者們根據(jù)OpenJDK創(chuàng)造一個(gè)許可的虛擬機(jī)通常是因?yàn)榭释カ@得面向特定操作系統(tǒng)的性能提升。比如,你下載的JVM作為Java運(yùn)行時(shí)環(huán)境的一部分就和操作系統(tǒng)密切相關(guān)聯(lián)。

3.JVM實(shí)例

在JVM規(guī)范被實(shí)現(xiàn)和作為一個(gè)軟件產(chǎn)品發(fā)行后, 你可以把它作為一個(gè)程序下載和運(yùn)行它。這個(gè)下載的程序就是一個(gè)JVM實(shí)例(或者稱為實(shí)例化的版本)。

大多數(shù)情況下,當(dāng)開發(fā)者們談到“JVM”,我們指的是運(yùn)行在開發(fā)過程或生產(chǎn)環(huán)境中的JVM實(shí)例。你可能會(huì)說,“那臺(tái)服務(wù)器上JVM用了多少內(nèi)存”,或者,“難以置信我創(chuàng)造了一個(gè)循環(huán)調(diào)用導(dǎo)致了棧溢出錯(cuò)誤直接把JVM搞崩潰了,這真是個(gè)是新手才犯的錯(cuò)誤啊!”。

軟件規(guī)范是什么?

軟件規(guī)范是一個(gè)人類可讀的文檔,它描述了一個(gè)軟件系統(tǒng)應(yīng)該怎樣運(yùn)作。一份文檔的目的是為工程師們創(chuàng)造一個(gè)編碼的清晰描述和需求規(guī)范。

在JVM中加載和執(zhí)行類文件

我們已經(jīng)談?wù)撨^JVM在運(yùn)行Java應(yīng)用中所扮演的角色,但是它如何執(zhí)行它的功能呢?為了運(yùn)行Java應(yīng)用,JVM依賴于Java的類加載器和一個(gè)Java執(zhí)行引擎。

JVM中的Java類加載器

在Java中,一切都是類,所有的應(yīng)用都由類構(gòu)建而來。一個(gè)應(yīng)用可以由一個(gè)或上千個(gè)類構(gòu)成。為了運(yùn)行Java應(yīng)用,JVM必須將編譯后的.class文件加載進(jìn)例如服務(wù)器這樣的環(huán)境中,使它們可以被訪問到。JVM依賴類加載器去執(zhí)行這個(gè)功能。

Java類加載器是JVM的一部分,它可以將類加載進(jìn)內(nèi)存并且使它們可以被獲取到和執(zhí)行。類加載器使用到了像懶加載和緩存的技術(shù)使類的加載能夠盡可能地高效率。也就是說,類的加載并不是一個(gè)史詩級(jí)的難題,只是一個(gè)輕便的內(nèi)存管理過程,因此這個(gè)技術(shù)相對(duì)來說是簡(jiǎn)單的。

每一個(gè)虛擬機(jī)都包含一個(gè)類加載器。JVM規(guī)范描述了在運(yùn)行時(shí)查詢和操縱類加載器的標(biāo)準(zhǔn)方法,但是具體還是由JVM實(shí)現(xiàn)來負(fù)責(zé)完成這些功能。從開發(fā)者的角度來看,底層的類加載器機(jī)制是個(gè)典型的黑盒子。

JVM中的執(zhí)行引擎

一旦類加載器完成加載類的工作后,JVM開始執(zhí)行每一個(gè)類的代碼。執(zhí)行引擎是JVM處理這個(gè)功能的組件,對(duì)于JVM來說,它是必不可少的,事實(shí)上,對(duì)于所有實(shí)際應(yīng)用,它都是JVM實(shí)例的一部分。

執(zhí)行代碼包括對(duì)系統(tǒng)資源的權(quán)限管理。JVM執(zhí)行引擎位于運(yùn)行中的程序——滿足它們對(duì)文件、網(wǎng)絡(luò)和內(nèi)存資源的需求——和提供這些資源操作系統(tǒng)之間。

執(zhí)行引擎如何管理系統(tǒng)資源

系統(tǒng)資源可以被分為兩大類:內(nèi)存和其他。

讓我們回顧一下,JVM負(fù)責(zé)處理不再被使用的內(nèi)存,垃圾收集是執(zhí)行處理任務(wù)的機(jī)制。JVM同時(shí)也負(fù)責(zé)分配和保持開發(fā)者授意的參照結(jié)構(gòu)。舉個(gè)例子,JVM執(zhí)行引擎負(fù)責(zé)接收J(rèn)VM中類似“new”這樣的關(guān)鍵字,然后將它轉(zhuǎn)化為向指定系統(tǒng)發(fā)出的內(nèi)存分配請(qǐng)求。

不只是內(nèi)存,JVM執(zhí)行引擎還負(fù)責(zé)管理文件系統(tǒng)的訪問以及網(wǎng)絡(luò)I/O資源。因?yàn)镴VM可以跨系統(tǒng)交互,所有這些不是很困難的任務(wù)。除了管理每個(gè)應(yīng)用的資源需求,執(zhí)行引擎還必須適應(yīng)每個(gè)系統(tǒng)的環(huán)境。這也是JVM可以處理各種各樣需求的原因。

JVM的發(fā)展:過去、現(xiàn)在、未來

1995年,JVM的問世帶來了兩個(gè)革命性的概念,成為了現(xiàn)代軟件發(fā)展的標(biāo)準(zhǔn)進(jìn)化方向:“一次編寫,到處運(yùn)行”以及自動(dòng)的內(nèi)存管理。軟件的互通性在那時(shí)是個(gè)大膽的概念,但在今天極少的開發(fā)者還需要去考慮它。類似地,軟件前輩們不得不自己管理內(nèi)存,而我們這一代是在垃圾收集的概念中成長(zhǎng)的。

我想說James Gosling (譯者注:Java發(fā)明者)和Brendan Eich(譯者注:Javascript發(fā)明者)發(fā)明了現(xiàn)代編程,但在后來的幾十年,成千上萬的后來者在它們的想法基礎(chǔ)上,進(jìn)行了重新定義和構(gòu)建。盡管JVM最初只是為Java使用,但在今天它已經(jīng)進(jìn)化成可以支持眾多腳本和編程語言,包括Scala, Groovy, 和Kotlin。往前看,很難看到一個(gè)JVM不是重要部分的未來。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容