虛擬機(jī)(VM)是計(jì)算機(jī)操作系統(tǒng)的虛擬仿真。除此之外,這種系統(tǒng)抽象還有兩種不同的實(shí)現(xiàn)方式。系統(tǒng)虛擬機(jī)作為功能齊全的操作系統(tǒng)存在,并且通常被創(chuàng)建為使用物理機(jī)的替代品。通過(guò)這種方式,多個(gè)環(huán)境可以同時(shí)在同一臺(tái)機(jī)器上運(yùn)行。想學(xué)習(xí)java技術(shù)的同學(xué),不妨報(bào)個(gè)Java培訓(xùn)班,有明確清晰的學(xué)習(xí)路線,理論知識(shí)+實(shí)戰(zhàn)操作,可以獲得快速提升。
公共語(yǔ)言運(yùn)行時(shí)(CLR)和Java虛擬機(jī)(JVM)都是進(jìn)程虛擬機(jī)。這意味著,它們不是執(zhí)行整個(gè)操作系統(tǒng),而是專(zhuān)門(mén)設(shè)計(jì)用于運(yùn)行進(jìn)程或程序,而不依賴(lài)于平臺(tái)環(huán)境。
深入了解CLR和JVM之間的相似之處
CLR和JVM都是虛擬機(jī),它們都執(zhí)行獨(dú)立于平臺(tái)的操作,即執(zhí)行編譯后的源代碼。從本質(zhì)上講,這些虛擬機(jī)都是程序員源代碼和系統(tǒng)機(jī)器代碼之間的中間步驟,允許各種類(lèi)型的處理器提高可用性。在下圖中,你可以看到兩者的高級(jí)功能實(shí)際上是完全相同的。
除了它們的基本功能外,兩者還包括垃圾收集、運(yùn)行時(shí)級(jí)安全性和異常處理的方法。最后一個(gè)相似之處是,兩者都采用了基于堆棧的操作,這是存儲(chǔ)和檢索操作數(shù)及其結(jié)果的最常見(jiàn)方法。對(duì)java感興趣的同學(xué)可以參加java培訓(xùn),你可以學(xué)會(huì)更多的java新技術(shù)。
但是,當(dāng)然,對(duì)于這些虛擬機(jī)共享的每一個(gè)相似之處,都可以發(fā)現(xiàn)實(shí)現(xiàn)上的差異。盡管如此,就像編程語(yǔ)言一樣,這些虛擬機(jī)的開(kāi)發(fā)以一種跳躍式的運(yùn)動(dòng)進(jìn)行。其中一個(gè)實(shí)現(xiàn)了類(lèi)似于“標(biāo)記-掃描-緊湊”的垃圾收集方法,另一個(gè)很快就會(huì)實(shí)現(xiàn)。
主要區(qū)別
語(yǔ)言和平臺(tái)兼容性
CLR和JVM之間的一個(gè)潛在的表面差異(盡管這可能影響了它們的開(kāi)發(fā)方式)是,JVM是專(zhuān)門(mén)為與Java一起工作而創(chuàng)建的,而CLR是為與語(yǔ)言無(wú)關(guān)而設(shè)計(jì)的。相反,CLR最初只設(shè)計(jì)在Windows操作系統(tǒng)上運(yùn)行,而JVM始終是操作系統(tǒng)無(wú)關(guān)的。不過(guò),我們都知道,時(shí)代已經(jīng)改變了,現(xiàn)在有了在Linux和Mac上運(yùn)行的CoreCLR,并且已經(jīng)開(kāi)發(fā)了更多的語(yǔ)言來(lái)使用JVM。
這導(dǎo)致了這樣一個(gè)事實(shí),即在大多數(shù)情況下,CLR和JVM之間的差異也是使用它們的語(yǔ)言之間差異的象征。或者,你可以說(shuō),語(yǔ)言之間的一些最顯著的差異(為了論證起見(jiàn),讓我們假設(shè)C#和Java)實(shí)際上是在VM級(jí)別實(shí)現(xiàn)的。想對(duì)java有更深入的了解,可以參加java培訓(xùn),在專(zhuān)業(yè)老師的指導(dǎo)下,可以很全面地掌握java最新的相關(guān)知識(shí)和技能。
JIT編譯
我們?cè)赩M級(jí)別看到的一個(gè)很大的區(qū)別是,盡管兩者都使用JIT(實(shí)時(shí))編譯,但編譯器不會(huì)被調(diào)用同時(shí)運(yùn)行。CLR在運(yùn)行時(shí)調(diào)用時(shí)會(huì)將所有MSIL代碼編譯為機(jī)器代碼。JVM使用一個(gè)名為HotSpot的專(zhuān)用性能引擎將Java字節(jié)碼JIT編譯為機(jī)器可讀代碼。它的不同之處在于它編譯和優(yōu)化了代碼中最常用的“熱點(diǎn)”。
在性能方面,這些編譯策略中的每一種都有自己的權(quán)衡。因?yàn)镃LR在運(yùn)行時(shí)調(diào)用時(shí)會(huì)對(duì)所有機(jī)器代碼進(jìn)行一次編譯,所以在某些情況下可以提高執(zhí)行時(shí)間。但另一方面,如果高頻率需要一小部分代碼,Java的HotSpot編譯器可以隨著時(shí)間的推移通過(guò)額外的優(yōu)化來(lái)提高效率。
語(yǔ)言功能的實(shí)現(xiàn)
另一個(gè)較小的區(qū)別是,CLR是用處理泛型類(lèi)型和在運(yùn)行時(shí)對(duì)這些類(lèi)型應(yīng)用參數(shù)化的指令構(gòu)建的。基本上,這意味著CLR可以識(shí)別List和List之間的區(qū)別,而JVM則不能(Java將泛型作為編譯器的一部分來(lái)實(shí)現(xiàn))。CLR還允許用戶以Structs的形式定義新的值類(lèi)型,而基于JVM的語(yǔ)言中的值類(lèi)型是固定的(byte、short、int、long、float、double、char、boolean),盡管有計(jì)劃改變這一點(diǎn)。java培訓(xùn)課程結(jié)構(gòu)良好,以正確的順序涵蓋了所有這些基本主題,使你的學(xué)習(xí)更加輕松。
生產(chǎn)監(jiān)控和異常處理
盡管兩者都包括異常處理方法,但兩者之間的總體差異可能會(huì)影響與不同異常和錯(cuò)誤監(jiān)視工具的兼容性。這反過(guò)來(lái)又會(huì)影響故障排除策略和工作流程。
性能和采用
研究發(fā)現(xiàn),Java編譯器生成的字節(jié)碼較小,這可能會(huì)對(duì)虛擬機(jī)的性能產(chǎn)生影響。然而,當(dāng)涉及到運(yùn)行代碼時(shí),執(zhí)行時(shí)間幾乎是50/50,CLR和JVM的執(zhí)行速度各快約一半。根據(jù)這項(xiàng)研究,當(dāng)談到Java和.NET用戶之間的激烈對(duì)立時(shí),虛擬機(jī)本身在區(qū)分能力方面的作用似乎比它們?cè)谥苯佑绊憫?yīng)用程序效率方面的作用更大。
這在考慮收養(yǎng)時(shí)也是有道理的。在企業(yè)公司中,開(kāi)發(fā)人員同時(shí)使用基于CLR和JVM的語(yǔ)言并不罕見(jiàn)。這種情況尤其可能發(fā)生在擁有許多不同部門(mén)從事各種項(xiàng)目和應(yīng)用程序的大公司中。越來(lái)越多的人選擇參加java培訓(xùn)來(lái)開(kāi)啟自己Java開(kāi)發(fā)人員的職業(yè)人生,這是一個(gè)快速有效的學(xué)習(xí)方式,可以在短時(shí)間內(nèi)掌握java所需的技能,更好地找到工作。
社區(qū)
說(shuō)到競(jìng)爭(zhēng),我們知道.NET和Java都有強(qiáng)大的社區(qū)支持。在這些社區(qū)中,開(kāi)發(fā)人員在StackOverflow等網(wǎng)站上提出問(wèn)題并進(jìn)行深入對(duì)話。快速搜索每個(gè)虛擬機(jī)的名稱(chēng)可以發(fā)現(xiàn),CLR被標(biāo)記了3250次,而JVM被標(biāo)記了8628次。
除了StackOverflow,微軟和甲骨文自己也培養(yǎng)了大量的社區(qū)。在那里,用戶可以找到更多與CLR和JVM相關(guān)的信息和資源。其中的主題包括云中的實(shí)現(xiàn)、疑難解答問(wèn)題等。除此之外,社區(qū)肯定更多地以.NET、Java、C/C++、Scala等個(gè)別語(yǔ)言和平臺(tái)為中心。
總結(jié)
從最高級(jí)別來(lái)看,CLR和JVM之間的差異似乎幾乎可以忽略不計(jì)。然而,在許多情況下(如果不是大多數(shù)的話),虛擬機(jī)級(jí)別的差異反映了使用它們的語(yǔ)言之間的關(guān)鍵差異。由于這些虛擬機(jī)及其相應(yīng)語(yǔ)言的構(gòu)建方式,每個(gè)虛擬機(jī)的功能略有不同,以便提供其創(chuàng)建者想要提供的功能。想學(xué)習(xí)java的同學(xué)可以參加java培訓(xùn),在專(zhuān)業(yè)老師的教導(dǎo)下,可以獲得快速提升。