溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java和.NET中的垃圾回收機制比較

發布時間:2020-07-19 23:17:47 來源:網絡 閱讀:1765 作者:cnn237111 欄目:編程語言

相同點:

都采用了分代的機制。

都支持并發GC。

都沒有采用引用計數方式,而是采用了追蹤技術。

.NET中,可以通過代碼GC.Collect() 強制要求CLR進行垃圾回收(由于垃圾回收是異步的,CLR有一個專用的線程負責垃圾回收,因此,即使調用GC.Collect,也并不是實時的調用了Finalize,因此要保證確實調用了析構方法,可以使用語句GC.WaitForPendingFinalizers()來確保析構方法真的被運行了,參考http://cnn237111.blog.51cto.com/2359144/1343004

Java中也可以通過System.gc() 強制要求進行垃圾回收。(事實上也僅僅是建議JVM執行垃圾回收,JVM并不一定立即做回收行為。)      
       

不同點:

CLR預留了一塊大空間,稱作large object heap (LOH),目的是當有大對象(超過85000字節的)需要分配空間時,就可以放在這里。

這塊地方和分代機制的不同之處在于,這個地方只有當發生full GC的時候,才會回收,而且這塊地方不會被壓縮。


Java中可以通過配置參數,使得大對象(大于設定的閾值)直接進入老年代(避免在年輕代上做大量的復制操作)。

JVM回收的內存的,僅僅在某些條件下才返回給操作系統。(詳見:http://stackoverflow.com/questions/366658/java-6-excessive-memory-usage#367933

.NET回收的內存,直接給返還給操作系統。


JVM在的垃圾回收機制,提供了大量的可配置參數。

而CLR的垃圾回收機制幾乎沒什么可以配置的(僅有的配置似乎就是工作站模式(Workstation)和服務器模式(Server))。


都支持并發GC。JAVA是在老年代上支持并發GC,采用的CMS收集器。

.NET的并發GC只在第2代上,并且在工作站模式下才會有。    

      

Java分成年輕代,老年代,永久代。

.NET分第0代,第1代,第2代。


.NET中采用了標記,壓縮的方式。

JAVA由于收集器很多,因此不限于一種算法。

             

年輕代

老年代

方式

Serial收集器

復制算法

             

單線程,stop the world

SerialOld收集器                  

             

標記整理算法

單線程,stop the world                  

ParNew收集器

復制算法

標記整理算法

多線程,stop the world

Parallel Scavenge收集器

復制算法                
           
多線程,stop the world               

CMS收集器

             

標記清除

單線程

G1收集器

復制

標記整理

             

   

Java垃圾回收的幾篇文章

http://www.cnblogs.com/shudonghe/p/3457990.html

http://blog.csdn.net/zhangerqing/article/details/8214365

.NET垃圾回收的幾篇文章

https://msdn.microsoft.com/zh-cn/library/ee787088(v=vs.110).aspx

http://www.mincoder.com/article/4284.shtml

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女