Java和.NET中的垃圾回收机制比较-创新互联
相同点:
站在用户的角度思考问题,与客户深入沟通,找到茫崖网站设计与茫崖网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站设计、网站制作、企业官网、英文网站、手机端网站、网站推广、主机域名、雅安服务器托管、企业邮箱。业务覆盖茫崖地区。都采用了分代的机制。
都支持并发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
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
名称栏目:Java和.NET中的垃圾回收机制比较-创新互联
文章分享:http://myzitong.com/article/ggpse.html