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

ben*_*rre 30 c# java garbage-collection

最近我从"高级"开发人员/同事那里得到了一些关于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.

有人有反馈意见吗?

Dan*_*ker 16

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

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

IDisposable与GC无关.它的命名,否则将被调用的方法的标准方式close,destroy,dispose等,并经常被称为是在Java中.有人建议Java 7添加与using调用类似close方法的关键字非常相似的东西.

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

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

  • 感谢指出`IDisposable`与垃圾收集无关.这是一个非常普遍的误解. (2认同)
  • 哦,告诉我吧!我花了几个小时在这个网站上试图解释不是*所有实现`IDisposable`的*都需要有一个终结器.例如,任何仅仅聚合其他"IDisposable"的东西.或者`yield return`方法生成的对象.或者在C++/CLI中使用析构函数的任何东西.或者任何不想处理来自随机线程的调用的类.MSDN文档以多种方式加剧了这种误解. (2认同)