繁体   English   中英

C#和Java中的垃圾收集有什么根本区别?

[英]What are the fundamental differences between garbage collection in C# and Java?

最近我从“高级”开发人员/同事那里得到了一些关于C#垃圾收集器的非常错误的声音建议,例如......

  • “你需要在C#中使用析构函数,因为不能依赖垃圾收集器。”

  • “C#垃圾收集器不能像Java垃圾收集器那样被认为是”。

这对我来说听起来非常可疑,据我所知,C#和Java垃圾收集器之间的差异如下......

  • C#是Generational垃圾收集器,Java是1.6中的并发标记扫描,G1是Java 7的新默认(分代)垃圾收集器,自~1.6.21以来一直是可选的。 我所知道的
  • C#作为一种语言能够手动处理实现IDisposable的对象。 Java必须始终使用垃圾收集,尽管某些框架(如SWT)要求您手动调用方法以释放底层本机代码中的内存。

我意识到Java和C#只是语言而垃圾收集器是运行时的一个组件,但是对于这种情况,我特别谈到了Sun / Oracle JVM和Microsoft .NET Runtime。

有人有反馈意见吗?

从广义上讲,你给出的建议很多。

C#和Java都有GC试图优化许多小对象的快速恢复。 它们旨在解决同样的问题,它们以稍微不同的方式实现,但作为用户,使用它们的方法中的技术差异很小,甚至对于大多数用户来说也是不存在的。

IDisposable可以与GC无关。 它是命名方法的标准方法,否则将被称为closedestroydispose等,并且通常在Java中称为。 有一个建议Java 7添加一些非常类似于using关键字的东西,它会调用类似的close方法。

C#中的“析构函数”指的是终结符 - 这是故意混淆C ++程序员的。 :) CLR规范本身称它们为终结器,就像JVM一样。

Java和C#/ CLR有很多不同的方式(用户值类型,属性,泛型和称为Linq的整个相关功能系列),但GC是一个可以在需要之前开发大量软件的领域要担心他们之间的差异。

他在析构函数方面倒退了。 您需要在C#中,除非重大使用析构函数。 如果你确实使用它们,你应该调用SuppressFinalize(),如果你知道对象处于不再需要析构函数代码的状态(通常是因为在调用IDisposable.Dispose()时发生了同样的清理。如果一个对象有一个析构函数并且还没有调用SuppressFinalize,它会活得更长(这样它就可以调用析构函数)。

垃圾收集器当然可以依赖。 不能依靠它来调用析构函数,或者在一定的时间内调用析构函数,但这不是它不可靠的问题,而是收集垃圾的可靠性问题,这是它的工作!

我对Java垃圾收集器了解不多,我毫不怀疑他说当你得到更精细的细节时他们不能像对方一样被认为是对的,尽管我希望为此着想Java程序员可以在大多数情况下将其视为.NET,这一点根本就没有考虑过,通常你不必这样做。

我担心你的同事是不正确的,但不要相信我的话。 让我们有一个链接巨星!

以下是关于GC的一些好文章: http//msdn.microsoft.com/en-us/magazine/bb985010.aspx http://msdn.microsoft.com/en-us/magazine/bb985011.aspx

此外,Maoni的WebLog有一些很棒的东西(也会带给你最新的,因为上面的文章已经很老了): http//blogs.msdn.com/b/maoni/

此外,就在本周,Raymond Chen正在撰写关于GC的系列文章: http//blogs.msdn.com/b/oldnewthing/archive/2010/08/13/10049634.aspx

以下是关于使用Dispose和Finalization的一个很好的讨论: http//www.bluebytesoftware.com/blog/2005/04/08/DGUpdateDisposeFinalizationAndResourceManagement.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM