日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CLR与JVM

發布時間:2023/12/4 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CLR与JVM 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.



首先要糾正垃圾回收在于JVM和.NET的CLR的平臺功能而不是語言本身。


存在一些歷史差異主要是因為.Net的設計是從java(和其他基于gc的平臺)演變中吸取教訓改良后的結果。



CLR一開始就設計成了分代垃圾回收,但是初始JVM沒有分代垃圾收集器。第一代的JVM垃圾收集器往往是Mark和Sweep這樣簡單。但隨著發展,JVM已引用了分代垃圾回收機制

JVM提供了大量選項來調整GC各個方面或者在不同模式直接 的切換,例如



相比之下,CLR幾乎沒有提供這樣繁瑣個性化配置,CLR通過不斷優化.NET或者.NETCore的性能來達到通用高性能和依靠服務器端的性能收集器來進行優化,最新基準測試.NETCore的性能已經在前幾相當可觀,避免開發人員花大量時間在clr調優又能享受極高性能,更關鍵的是可讓所有應用無關底層平臺配置而進行快速升級,而JVM提供的底層配置可不斷修改jvm配置以適應業務發展,但是,這樣個性化配置也是一把雙刃劍,JVM調優不是一件容易的事,他是幾十個配置疊加的效果,往往并不只是把GC頻率和調大調小那樣簡單,另一方面這些JVM的優化只是用來掩蓋問題的手段。真正為何引發性能問題而往往被忽視,到最后還是不得不去尋找問題根源






CLR和JVM之間的5個相似點和不同點


CLR和JVM之間的最大相似之處包括:


?● 兩臺虛擬機(VM)


?● 兩者都包括垃圾收集


?● 兩者都采用基于堆棧的操作


?● 兩者都包括運行時級安全性


?● 兩者都有異常處理方法


CLR和JVM之間的主要區別包括:


?● CLR被設計為與語言無關,JVM被設計為特定于Java


?● CLR最初只與Windows兼容(已發布多年的.netcore和將來的.net5都是跨平臺),JVM適用于所有主要操作系統


?● CLR使用JIT編譯器,JVM使用稱為Java HotSpot的專用JIT編譯器


?● CLR包含閉包,async await協程和指針聲明/操作的指令,而JVM則沒有


● 值類型的處理,JVM中根據逃逸分析的參數來決定何時哪些對象在堆上創建,否則在棧或者寄存器上創建以減少內存空間,而在CLR中是原生支持值類型


?


什么是虛擬機?


不難猜測虛擬機(VM)是計算機操作系統的虛擬仿真。除此之外,這種系統抽象有兩種不同的實現方式。


系統虛擬機作為全功能操作系統存在,通常創建為替代使用物理機器。通過這種方式,多個環境可以同時在同一臺機器上運行。但是,這聽起來不像我們熟悉的CLR和JVM。


公共語言運行時(CLR)和Java虛擬機(JVM)都是進程虛擬機。這意味著它們不是執行整個操作系統,而是專門設計用于運行流程或程序而不依賴于平臺環境。


深入研究CLR與JVM的相似之處


CLR和JVM都是虛擬機,它們都執行與平臺無關的操作,即執行已編譯的源代碼。從本質上講,這些虛擬機既可以作為程序員源代碼和系統機器代碼之間的中間步驟,也可以通過各種類型的處理器實現更高的可用性。在下圖中,您可以看到兩者的高級功能實際上是很相同的。






CLR與JVM高級功能


除了基本功能之外,還包括垃圾收集,運行時安全性和異常處理的方法。最后提到的一個相似之處是,它們都采用基于堆棧的操作,這是存儲和檢索操作數及其結果的最常用方法。


但是,當然,對于這些VM共享的每個相似性,可以找到實現上的差異。盡管如此,正如編程語言一樣,這些虛擬機的開發互相學習。一個實現類似垃圾收集的 ?mark-sweep-compact 方法,另一個很快就會跟進。


主要差異:


語言和平臺兼容性


CLR和JVM之間的一個潛在差異(盡管可能影響它們的開發方式)JVM是專門用于Java的,而CLR是為了與語言無關而設計的。相反,CLR最初設計為僅在Windows操作系統上運行,而JVM始終與操作系統無關。眾所周知,隨著發展16年微軟發布.netcore,現在有了在Linux和Mac上運行的CoreCLR。


這導致了這樣一個情況,即在大多數情況下,CLR和JVM之間的差異也是使用它們的語言之間的差異。或者,也可以說語言之間的一些最重要的差異。


JIT編譯


我們在VM級別看到的一個很大的區別是,雖然兩者都使用JIT(即時)編譯,但編譯器不會被調用同時運行。CLR在運行時調用時將所有MSIL代碼編譯為機器代碼。JVM使用名為HotSpot的專用性能引擎將Java字節碼JIT編譯為機器可讀代碼。它的不同之處在于它編譯和優化了最常用的代碼中的“熱點”。


每種編譯策略在性能方面都有自己的權衡。因為CLR在運行時會編譯一次所有機器代碼,所以在某些情況下執行時間會有所改善。但另一方面,如果需要高頻率的一小部分代碼,Java的HotSpot編譯器可以通過額外的優化來提高效率。


語言特色的實現


另一個較小的區別是CLR是使用指令來構建處理泛型類型以及運行時類型。基本上,這意味著CLR識別例如List <int>和List <String>之間的區別,而JVM則不能(Java實現的泛型是作為編譯器的一部分,換句話說他只是語法糖,而沒有真正的在執行期間判斷類型,往往用java泛型要考慮到類型擦除的問題)。CLR還允許用戶以Structs的形式定義新的值類型,而基于JVM的語言中的值類型是固定的(byte,short,int,long,float,double,char,boolean)。


生產監控和異常處理


雖然兩者都包含異常處理方法,但兩者之間的總體差異可能會影響與不同異常和錯誤監視工具的兼容性。反過來,這會影響故障排除策略和工作流程。




表現和采用


眾所周知JAVA在運行期間占用大量內存,一方面由于沒有原生支持值類型導致的內存占用,另一方面雖然JVM支持由開發人員設置GC策略,但是往往設置的低于CLR平臺很大概率會導致應用沒有更多可用空間而崩潰。




社區


說到競爭對手,我們知道.NET和Java都有強大的社區支持它們。在這些社區中,開發人員會在StackOverflow等網站上提出問題并進行深入的對話。搜索VM的名稱可以發現,與已標記為8,628次的JVM相比,CLR已標記了3,250次。


在StackOverflow之外,還有微軟和Oracle自己培養的廣泛社區。在那里,用戶可以找到與CLR和JVM不僅僅相關的其他信息和資源。包括云中的實施,故障排除問題等。


除此之外,社區肯定更多地圍繞個人語言和平臺,如.NET,Java,C / C ++,Scala等。


最后的想法


在最高級別查看這些VM,CLR和JVM之間的差異似乎幾乎可以忽略不計。但是,在許多(如果不是大多數)情況下,VM級別的差異反映了使用它們的語言之間的主要差異。由于構建了這些VM及其相應語言的方式,每個VM的功能略有不同,以便提供作者想要提供的功能






參考


https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html




https://stackoverflow.com/questions/453610/javas-virtual-machine-and-clr


總結

以上是生活随笔為你收集整理的CLR与JVM的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。