我最近有一些非常错误的探测建议从“前辈”开发商/同事关于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。
有没有人反馈?
你的同事对于析构函数是完全错误的。引用微软的框架设计指南:“如果你能帮上忙,你真的不想写一个终结器。” – TrueWill 2010-08-13 16:09:06
我很害怕你的同事错了。终结器甚至不是真正的析构函数 - 它不是手动释放托管对象实例的方法。事实上,如果你有一个终结器,它会被垃圾收集器调用。终结器存在让你清理非托管内存 - 就像你做了一个WinAPI调用并得到一个句柄 - GC不能收集像句柄一样的非托管内存,你可以使用终结器(尽管使用.Net 2.0和你可能会使用SafeHandle来代替)。 – JMarsch 2010-08-13 16:31:02
我不同意GC不可靠。自2001年以来,我们一直在使用.Net进行开发,包括Web应用程序和一些Windows服务(Windows服务可以运行数月,并且通常只在Windows Update需要重新启动时才重新启动)。 我见过的唯一的“泄漏”属于2个桶:大多数情况下我们保留了一个引用(我们代码中存在一个bug),还有一些情况是我们的代码调用了非托管代码(旧C++ DLL或Winapi等),并且非托管代码中存在泄漏(GC无法帮助您处理非托管内存) – JMarsch 2010-08-13 16:45:03