垃圾回收的副作用是什么?

3

这可能是一个非常具体的问题,但我是那种看到什么就会问的人。尽管垃圾回收运行时提供了内存和生命周期管理的诸多好处,但是否存在由应用程序与其垃圾回收器之间的竞态条件引起的程序不确定性的显着案例?是否已经出现了一种防御性编程的整体思路来应对这种情况?当然,习惯于RAII的程序员在GC的存在下必须学习一些教训。

4个回答

7

垃圾回收的问题是它只管理内存资源。不幸的是,程序员必须管理许多其他类型的资源:

  • 文件和套接字句柄
  • 数据库连接
  • 同步对象
  • GUI 资源

仅举几例。要成功管理这些资源,确实需要 RAII 习惯用法中体现的概念。


6

我认为您对自动垃圾回收的工作原理存在误解。在应用程序和正确实现的垃圾收集器之间不存在竞争条件,即使在原则上也是如此。垃圾收集器只会回收应用程序无法访问的对象。

由于两者中只有一个可以“拥有”给定的对象,因此不可能发生竞争条件。


1
在正确实现的垃圾回收系统中,你不应该能够“复活”一个已经可以被垃圾回收的对象,因为你没有任何方式来引用它。同样地,正在进行终结操作的对象也不符合回收条件,因为你仍然可以引用它。 - MarkusQ
1
在CLR中,您可以在终结周围获得竞争条件。请阅读此内容,其中突出显示了一个示例:http://blogs.msdn.com/cbrumme/archive/2003/04/19/51365.aspx - Greg Beech
1
还可以在这里查看关于可达性的部分:http://blogs.msdn.com/cbrumme/archive/2004/02/20/77460.aspx - Greg Beech
1
@GregBeech 我说过(并且我引用)“在一个正确实现的GC系统中”;如果你提供的链接准确,那么它们只是证明了CLR GC没有被正确实现。他们本来不必这样做,而且有很多理由不应该这样做;说“微软这样做所以一定是对的”是站不住脚的。 - MarkusQ
@MarkusQ:Finalization是一种机制,通过该机制,可能有其他实体代表其执行操作的已弃用对象(例如,保留内存区域、文件句柄等)可以通知这些其他实体停止执行操作。当GC运行时,它有效地将对象分为三类:活动对象、完全死亡的对象和已请求放弃通知的废弃对象。虽然理论上可以设计一个系统,在该系统中,对象通过注册其他不相关的对象(这些对象持有清理所需的信息)来请求放弃通知... - supercat
显示剩余6条评论

5
六年前我转向.NET世界时,我对GC感到不安,并认为它应该要慢得多,我必须更加小心地分配内存以避免产生性能问题。
经过六年的时间,我可以告诉你,我的观点已经完全改变了!在这些年里,我只记得有一次由于忘记了.Dispose()而导致内存泄漏。相比之下,在C++中每小时都会产生内存泄漏... ;-)
最近我被迫回到了C++世界,我感到非常震惊!我曾经喜欢并使用过这个东西吗?使用C#比使用C++至少提高了10倍的生产力。而且:GC内存分配器是如此之快,以至于我仍然无法相信。看看这个问题,我不得不得出结论,在我的特定情况下,.NET版本(C#或C++/CLI)执行速度比C++ MFC版本快10倍:C++ string memory allocation
我已经完全转变了 - 但是需要很长时间才能完全接受它。

在我的情况下,确实存在一个泄漏问题!在我找出它的来源之前,它已经存在了很长一段时间。这与一个选项卡控件有关,该控件由从TabPage派生的UserControl填充。这非常有趣,我已经尝试将其隔离开来以进行演示... - Dan Byström
同意! :-) 当涉及到WinForms时,事情确实很模糊,因为它必须在Win32之上运行。"...或者当一些模糊的引用路径锁定它时..." - Dan Byström

0
当我开始使用C语言进行编程时,我必须非常谨慎地处理malloc和realloc,并释放我不再使用的所有内容。对于像创建二叉树这样的小型大学作业来说,这是一项容易的任务。但是,当我开始开发一个完全由C编写的GUI应用程序时,由于我必须注意可能存在的内存泄漏,我不得不更多地思考和编程较少。这变得很麻烦。我宁愿拥有一个半成品而不是一个半吊子的产品。
我开始转向Java和C#。我喜欢的是,我所要做的就是取消引用一个对象,垃圾收集器就会来帮我清理它。我还注意到,使用Java的Swing时我的程序运行速度有点慢(如预期),但这是可以管理的。
在我的研究中,由于处理器变得更便宜、内存变得更便宜和更快,GUI程序比以前消耗更多的内存。垃圾收集器确实有助于获得一个能够正常工作且最小化内存泄漏问题的产品。这真的很方便,但可能会导致不良的编码习惯,不过这些可以纠正。
编辑:

同样也看一下这个或许可以帮助你回答问题。我的意见是好的阅读材料。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接