.Net vs Java垃圾收集器

有谁知道Java和.Net垃圾收集器之间的主要区别? networkingsearch没有透露太多,这是一个在testing中出现的问题。

CLR(.Net)GC和JVM GC之间的差别在于语言本身。 两者都可能发生变化,而且它们的行为规范是松散的,以便在不影响程序正确性的情况下进行更改。

.Net有一些历史性的差异,主要是因为.Net是从java(和其他基于gc的平台)的发展中吸取经验教训的。 下面不要假设.Net在某种程度上是优越的,因为它从一开始就包含了function,这只是后来的结果。

一个显着的公众可见的区别是,MS GC暴露了其代代性质(通过GC api),这可能会保持一段时间,因为根据大多数程序展现的行为,这是一个明显的方法:大多数分配是非常短命。

最初的JVM没有世代垃圾回收器,尽pipe这个function很快被添加了。 Sun Oracle和其他人采用的第一代收集器往往是Mark和Sweep。 人们认识到,标记扫描 – 紧凑方法会导致更好的内存位置,从而certificate额外的复制开销。 CLR运行时首次出现这种行为。

Sun Oracle和Microsoft的GC实施“精神”之间的区别是可configuration性。

Sun提供了大量的选项(在命令行)来调整GC的各个方面,或者在不同模式之间切换。 许多选项是-X或-XX,表示它们在不同版本或供应商中缺乏支持。 相比之下,CLR几乎没有可configuration性; 您唯一真正的select是使用服务器或客户端收集器,分别优化吞吐量和延迟。

GC战略的积极研究正在两家公司(以及开放源代码实施)中进行,最新的GC实现中使用的当前方法是每个线程伊甸园区域(改善局部性并允许伊甸园收集可能不会导致完全暂停)作为试图避免将某些分配放入伊甸园一代的前期工作方法。

这只是为了增加ShuggyCoUk的出色答案。 .NET GC也使用已知的大对象堆(LOH)。 CLR在LOH上预先分配了一堆对象,并且在LOH上也分配了至less85000字节的所有用户分配的对象。 而且,由于一些内部优化,在LOH上也分配了1000个或更多元素的double[]

LOH的处理方式不同于各代的堆代:

  • 它只是在全面收集时清理干净,而且不会像世代堆积一样压缩。
  • 从LOH分配是通过一个空闲列表完成的,就像在C运行时处理malloc一样,而从世代堆中分配基本上是通过在第0代中移动一个指针来完成的。

我不知道JVM是否有类似的东西,但它是关于如何在.NET中处理内存的重要信息,所以希望你觉得它有用。

如果我没有记错,那么JVM就不会像CLR那样将释放的内存释放回操作系统。

Java 5在其GCalgorithm中引入了很多变化。

我不是一个C#的maven,但是这两篇文章告诉我,它们已经从简单的标记和扫描发展到了更新一代的模型:

http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html http://www.csharphelp.com/archives2/archive297.html

我find了这个:

在J2SE平台版本1.4.2中有四个垃圾收集器可供select,但是没有用户的明确select,总是select了串行垃圾收集器。 在5.0版本中,收集器的select是基于启动应用程序的机器的类别。

这里和这个

就像JVMpipe理对象的销毁一样,CLR也通过Mark和Compact垃圾回收algorithm来处理

这里

我希望这有帮助…