java和net共同点,Java和.NET中的垃圾回收机制比较
相同點(diǎn):
都采用了分代的機(jī)制。
都支持并發(fā)GC。
都沒(méi)有采用引用計(jì)數(shù)方式,而是采用了追蹤技術(shù)。
.NET中,可以通過(guò)代碼GC.Collect() 強(qiáng)制要求CLR進(jìn)行垃圾回收(由于垃圾回收是異步的,CLR有一個(gè)專(zhuān)用的線程負(fù)責(zé)垃圾回收,因此,即使調(diào)用GC.Collect,也并不是實(shí)時(shí)的調(diào)用了Finalize,因此要保證確實(shí)調(diào)用了析構(gòu)方法,可以使用語(yǔ)句GC.WaitForPendingFinalizers()來(lái)確保析構(gòu)方法真的被運(yùn)行了,參考http://cnn237111.blog.51cto.com/2359144/1343004)
Java中也可以通過(guò)System.gc() 強(qiáng)制要求進(jìn)行垃圾回收。(事實(shí)上也僅僅是建議JVM執(zhí)行垃圾回收,JVM并不一定立即做回收行為。)
不同點(diǎn):
CLR預(yù)留了一塊大空間,稱作large object heap (LOH),目的是當(dāng)有大對(duì)象(超過(guò)85000字節(jié)的)需要分配空間時(shí),就可以放在這里。
這塊地方和分代機(jī)制的不同之處在于,這個(gè)地方只有當(dāng)發(fā)生full GC的時(shí)候,才會(huì)回收,而且這塊地方不會(huì)被壓縮。
Java中可以通過(guò)配置參數(shù),使得大對(duì)象(大于設(shè)定的閾值)直接進(jìn)入老年代(避免在年輕代上做大量的復(fù)制操作)。
.NET回收的內(nèi)存,直接給返還給操作系統(tǒng)。
JVM在的垃圾回收機(jī)制,提供了大量的可配置參數(shù)。
而CLR的垃圾回收機(jī)制幾乎沒(méi)什么可以配置的(僅有的配置似乎就是工作站模式(Workstation)和服務(wù)器模式(Server))。
都支持并發(fā)GC。JAVA是在老年代上支持并發(fā)GC,采用的CMS收集器。
.NET的并發(fā)GC只在第2代上,并且在工作站模式下才會(huì)有。
Java分成年輕代,老年代,永久代。
.NET分第0代,第1代,第2代。
.NET中采用了標(biāo)記,壓縮的方式。
JAVA由于收集器很多,因此不限于一種算法。年輕代老年代方式
Serial收集器復(fù)制算法單線程,stop the world
SerialOld收集器標(biāo)記整理算法單線程,stop the world
ParNew收集器復(fù)制算法標(biāo)記整理算法多線程,stop the world
Parallel Scavenge收集器復(fù)制算法多線程,stop the world
CMS收集器標(biāo)記清除單線程
G1收集器復(fù)制標(biāo)記整理
Java垃圾回收的幾篇文章
.NET垃圾回收的幾篇文章
總結(jié)
以上是生活随笔為你收集整理的java和net共同点,Java和.NET中的垃圾回收机制比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: exception in thread
- 下一篇: 程序员应该知道的二十三种设计模式