2010-08-13 74 views
29

我最近有一些非常错误的探测建议从“前辈”开发商/同事关于C#垃圾收集器,如...C#和Java垃圾收集之间的根本区别是什么?

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

  • “C#垃圾收集器不能是 想到像Java垃圾 收集器”。

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

  • 的C#是一个代垃圾 收集,爪哇并发标记 在1.6中扫描,G1是新的 默认(世代)垃圾 具有Java 7的收集器,并具有 自〜1.6.21以来一直是可选的。至于 据我所知
  • C#作为一种语言有能力 手动处理对象 实现IDisposable。 Java必须 始终使用垃圾回收, 尽管一些框架如SWT 要求您手动调用方法 释放内存中的基本 本机代码。

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

有没有人反馈?

+5

你的同事对于析构函数是完全错误的。引用微软的框架设计指南:“如果你能帮上忙,你真的不想写一个终结器。” – TrueWill 2010-08-13 16:09:06

+5

我很害怕你的同事错了。终结器甚至不是真正的析构函数 - 它不是手动释放托管对象实例的方法。事实上,如果你有一个终结器,它会被垃圾收集器调用。终结器存在让你清理非托管内存 - 就像你做了一个WinAPI调用并得到一个句柄 - GC不能收集像句柄一样的非托管内存,你可以使用终结器(尽管使用.Net 2.0和你可能会使用SafeHandle来代替)。 – JMarsch 2010-08-13 16:31:02

+2

我不同意GC不可靠。自2001年以来,我们一直在使用.Net进行开发,包括Web应用程序和一些Windows服务(Windows服务可以运行数月,并且通常只在Windows Update需要重新启动时才重新启动)。 我见过的唯一的“泄漏”属于2个桶:大多数情况下我们保留了一个引用(我们代码中存在一个bug),还有一些情况是我们的代码调用了非托管代码(旧C++ DLL或Winapi等),并且非托管代码中存在泄漏(GC无法帮助您处理非托管内存) – JMarsch 2010-08-13 16:45:03

回答

15

从广义上讲,你得到的建议是一大堆hooey。

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

IDisposable与GC本身没有任何关系。这是命名方法的一种标准方式,否则将被称为close,destroy,dispose等,并且通常在Java中被称为。有一个建议Java 7添加一些非常类似于using关键字的东西,它会调用类似的close方法。

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

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

+2

感谢您指出'IDisposable'与垃圾回收无关。这是一个非常普遍的误解。 – 2010-08-13 16:12:24

+2

哦,告诉我吧!我花了几个小时在这个网站上试图解释说,不是所有实现'IDisposable'的东西都需要一个终结器。例如任何仅仅聚合其他“IDisposables”的东西。或者'yield return'方法生成的对象。或者在C++/CLI中使用析构函数。或者任何不想处理来自随机线程的调用的类。MSDN文件在很多方面加剧了这种误解。 – 2010-08-13 16:15:41

3

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

垃圾收集器当然是可以信赖的,它不能被依赖于调用析构函数,或者在一定的时间内这样做,但这不是一个不可靠的问题,这是一个可靠的垃圾收集工作!

我不知道很多关于Java垃圾收集器的信息,我毫不怀疑他说他们不能被认为是正确的当你仔细研究细节的时候,尽管我希望Java编程人员能够在大多数时候认为它像.NET一样 - 但是根本不去想它,一般你不需要。

2

恐怕你的同事不正确,但不要听我的话。让我们有一个链接节日!

这里是GC一些好文章: http://msdn.microsoft.com/en-us/magazine/bb985010.aspx http://msdn.microsoft.com/en-us/magazine/bb985011.aspx

此外,猫腻的网络日志有一些伟大的东西(会为你带来最新的为好,因为上面的文章是相当老): http://blogs.msdn.com/b/maoni/

而且,就在本周,雷蒙德陈在做的GC系列: http://blogs.msdn.com/b/oldnewthing/archive/2010/08/13/10049634.aspx

这里的使用和处置国际泳联商量好了价格: http://www.bluebytesoftware.com/blog/2005/04/08/DGUpdateDisposeFinalizationAndResourceManagement.aspx

+1

对于每个链接,获得小的摘要可以帮助您理清发言。 – 2016-12-28 22:38:06