CLR与JVM
首先要糾正垃圾回收在于JVM和.NET的CLR的平臺功能而不是語言本身。
存在一些歷史差異主要是因為.Net的設(shè)計是從java(和其他基于gc的平臺)演變中吸取教訓改良后的結(jié)果。
CLR一開始就設(shè)計成了分代垃圾回收,但是初始JVM沒有分代垃圾收集器。第一代的JVM垃圾收集器往往是Mark和Sweep這樣簡單。但隨著發(fā)展,JVM已引用了分代垃圾回收機制
JVM提供了大量選項來調(diào)整GC各個方面或者在不同模式直接 的切換,例如
相比之下,CLR幾乎沒有提供這樣繁瑣個性化配置,CLR通過不斷優(yōu)化.NET或者.NETCore的性能來達到通用高性能和依靠服務(wù)器端的性能收集器來進行優(yōu)化,最新基準測試.NETCore的性能已經(jīng)在前幾相當可觀,避免開發(fā)人員花大量時間在clr調(diào)優(yōu)又能享受極高性能,更關(guān)鍵的是可讓所有應(yīng)用無關(guān)底層平臺配置而進行快速升級,而JVM提供的底層配置可不斷修改jvm配置以適應(yīng)業(yè)務(wù)發(fā)展,但是,這樣個性化配置也是一把雙刃劍,JVM調(diào)優(yōu)不是一件容易的事,他是幾十個配置疊加的效果,往往并不只是把GC頻率和調(diào)大調(diào)小那樣簡單,另一方面這些JVM的優(yōu)化只是用來掩蓋問題的手段。真正為何引發(fā)性能問題而往往被忽視,到最后還是不得不去尋找問題根源
CLR和JVM之間的5個相似點和不同點
CLR和JVM之間的最大相似之處包括:
?● 兩臺虛擬機(VM)
?● 兩者都包括垃圾收集
?● 兩者都采用基于堆棧的操作
?● 兩者都包括運行時級安全性
?● 兩者都有異常處理方法
CLR和JVM之間的主要區(qū)別包括:
?● CLR被設(shè)計為與語言無關(guān),JVM被設(shè)計為特定于Java
?● CLR最初只與Windows兼容(已發(fā)布多年的.netcore和將來的.net5都是跨平臺),JVM適用于所有主要操作系統(tǒng)
?● CLR使用JIT編譯器,JVM使用稱為Java HotSpot的專用JIT編譯器
?● CLR包含閉包,async await協(xié)程和指針聲明/操作的指令,而JVM則沒有
● 值類型的處理,JVM中根據(jù)逃逸分析的參數(shù)來決定何時哪些對象在堆上創(chuàng)建,否則在棧或者寄存器上創(chuàng)建以減少內(nèi)存空間,而在CLR中是原生支持值類型
?
什么是虛擬機?
不難猜測虛擬機(VM)是計算機操作系統(tǒng)的虛擬仿真。除此之外,這種系統(tǒng)抽象有兩種不同的實現(xiàn)方式。
系統(tǒng)虛擬機作為全功能操作系統(tǒng)存在,通常創(chuàng)建為替代使用物理機器。通過這種方式,多個環(huán)境可以同時在同一臺機器上運行。但是,這聽起來不像我們熟悉的CLR和JVM。
公共語言運行時(CLR)和Java虛擬機(JVM)都是進程虛擬機。這意味著它們不是執(zhí)行整個操作系統(tǒng),而是專門設(shè)計用于運行流程或程序而不依賴于平臺環(huán)境。
深入研究CLR與JVM的相似之處
CLR和JVM都是虛擬機,它們都執(zhí)行與平臺無關(guān)的操作,即執(zhí)行已編譯的源代碼。從本質(zhì)上講,這些虛擬機既可以作為程序員源代碼和系統(tǒng)機器代碼之間的中間步驟,也可以通過各種類型的處理器實現(xiàn)更高的可用性。在下圖中,您可以看到兩者的高級功能實際上是很相同的。
CLR與JVM高級功能
除了基本功能之外,還包括垃圾收集,運行時安全性和異常處理的方法。最后提到的一個相似之處是,它們都采用基于堆棧的操作,這是存儲和檢索操作數(shù)及其結(jié)果的最常用方法。
但是,當然,對于這些VM共享的每個相似性,可以找到實現(xiàn)上的差異。盡管如此,正如編程語言一樣,這些虛擬機的開發(fā)互相學習。一個實現(xiàn)類似垃圾收集的 ?mark-sweep-compact 方法,另一個很快就會跟進。
主要差異:
語言和平臺兼容性
CLR和JVM之間的一個潛在差異(盡管可能影響它們的開發(fā)方式)JVM是專門用于Java的,而CLR是為了與語言無關(guān)而設(shè)計的。相反,CLR最初設(shè)計為僅在Windows操作系統(tǒng)上運行,而JVM始終與操作系統(tǒng)無關(guān)。眾所周知,隨著發(fā)展16年微軟發(fā)布.netcore,現(xiàn)在有了在Linux和Mac上運行的CoreCLR。
這導致了這樣一個情況,即在大多數(shù)情況下,CLR和JVM之間的差異也是使用它們的語言之間的差異。或者,也可以說語言之間的一些最重要的差異。
JIT編譯
我們在VM級別看到的一個很大的區(qū)別是,雖然兩者都使用JIT(即時)編譯,但編譯器不會被調(diào)用同時運行。CLR在運行時調(diào)用時將所有MSIL代碼編譯為機器代碼。JVM使用名為HotSpot的專用性能引擎將Java字節(jié)碼JIT編譯為機器可讀代碼。它的不同之處在于它編譯和優(yōu)化了最常用的代碼中的“熱點”。
每種編譯策略在性能方面都有自己的權(quán)衡。因為CLR在運行時會編譯一次所有機器代碼,所以在某些情況下執(zhí)行時間會有所改善。但另一方面,如果需要高頻率的一小部分代碼,Java的HotSpot編譯器可以通過額外的優(yōu)化來提高效率。
語言特色的實現(xiàn)
另一個較小的區(qū)別是CLR是使用指令來構(gòu)建處理泛型類型以及運行時類型。基本上,這意味著CLR識別例如List <int>和List <String>之間的區(qū)別,而JVM則不能(Java實現(xiàn)的泛型是作為編譯器的一部分,換句話說他只是語法糖,而沒有真正的在執(zhí)行期間判斷類型,往往用java泛型要考慮到類型擦除的問題)。CLR還允許用戶以Structs的形式定義新的值類型,而基于JVM的語言中的值類型是固定的(byte,short,int,long,float,double,char,boolean)。
生產(chǎn)監(jiān)控和異常處理
雖然兩者都包含異常處理方法,但兩者之間的總體差異可能會影響與不同異常和錯誤監(jiān)視工具的兼容性。反過來,這會影響故障排除策略和工作流程。
表現(xiàn)和采用
眾所周知JAVA在運行期間占用大量內(nèi)存,一方面由于沒有原生支持值類型導致的內(nèi)存占用,另一方面雖然JVM支持由開發(fā)人員設(shè)置GC策略,但是往往設(shè)置的低于CLR平臺很大概率會導致應(yīng)用沒有更多可用空間而崩潰。
社區(qū)
說到競爭對手,我們知道.NET和Java都有強大的社區(qū)支持它們。在這些社區(qū)中,開發(fā)人員會在StackOverflow等網(wǎng)站上提出問題并進行深入的對話。搜索VM的名稱可以發(fā)現(xiàn),與已標記為8,628次的JVM相比,CLR已標記了3,250次。
在StackOverflow之外,還有微軟和Oracle自己培養(yǎng)的廣泛社區(qū)。在那里,用戶可以找到與CLR和JVM不僅僅相關(guān)的其他信息和資源。包括云中的實施,故障排除問題等。
除此之外,社區(qū)肯定更多地圍繞個人語言和平臺,如.NET,Java,C / C ++,Scala等。
最后的想法
在最高級別查看這些VM,CLR和JVM之間的差異似乎幾乎可以忽略不計。但是,在許多(如果不是大多數(shù))情況下,VM級別的差異反映了使用它們的語言之間的主要差異。由于構(gòu)建了這些VM及其相應(yīng)語言的方式,每個VM的功能略有不同,以便提供作者想要提供的功能
參考
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
https://stackoverflow.com/questions/453610/javas-virtual-machine-and-clr
總結(jié)
                            
                        - 上一篇: 利用ICSharpCore搭建基于.NE
 - 下一篇: 使用Mutex进行线程处理