我如何使用垃圾收集器?

时间:2010-07-06 14:04:04

标签: c# garbage-collection

对GC一无所知,从不需要使用它(或者我认为),这是什么样的常见用途,如果我自己提高技能并了解GC的更多信息,我/我的系统如何受益? ?

更新 ...我怎样才能让GC更容易?

10 个答案:

答案 0 :(得分:14)

GC的典型用法是根本不使用它,让CLR为您处理所有事情。

答案 1 :(得分:3)

  

更新......我怎样才能让事情变得更轻松   对于GC?

让GC变得更容易的最简单方法是让它在不干扰的情况下完成工作。它可以优化何时需要自行运行。

我会考虑何时在C#中使用Finalizer。这是一个可以帮助GC解决问题的领域。

了解Large Object Heap可能会带来一些好处,但这可能会导致问题。

http://techiemate.blogspot.com/2009/04/garbage-collection-in-net.html

答案 2 :(得分:2)

使用垃圾收集器的最佳方法是......

请勿尝试使用它!

让它做自己的事情。几乎在任何时候人们尝试使用GC来使其“更有效”,他们最终会抑制它并实际上使其工作变得更糟。

答案 3 :(得分:1)

GC与您在C ++中定义的析构函数不同。也就是说,您不需要定义它并释放先前分配的内存。 GC的全部意义在于它是自动的。 我的建议是给我们更多关于你想要做什么/理解什么的信息,因为这听起来不安全。

答案 4 :(得分:1)

为了使GC更容易,请始终在支持IDisposable接口的任何对象上调用Dispose()。

答案 5 :(得分:1)

关于使用GC进行编码的几点:

  1. 当您不再使用事件处理程序时,请务必取消注册。这是对象在其预期生命周期内保持活动的最常见方式,如果Disposed对象调用了事件处理程序,也会导致错误。

  2. 如果您正在使用非托管代码进行互操作,则需要更加了解使用非托管代码共享托管内存。您可能需要使用固定和/或GC.KeepAlive来帮助GC了解您的非托管代码需要什么。尽量保持最低限度,因为它会使GC更难。

  3. 您几乎不需要实现终结器。如果该类确实有一个终结器,它也应该实现与IDisposable相同的清理并在处理后调用GC.SuppressFinalize(this),因为这有助于GC在您上课后有效清理。

答案 6 :(得分:0)

如果您没有注意到您正在使用GC,那么您正在使用它,并且您正在使用它。

如果您错误地使用GC,那么了解GC的内部结构才会起作用。

答案 7 :(得分:0)

理解它是如何工作的总是有用的;但在大多数情况下,你不必太担心。

当你开始分配非托管资源(或那些有关的资源)时,值得阅读IDisposable pattern,以便你可以控制何时释放资源(或者如果你想要发声,则可以控制“确定性终结”)与同伴交谈时知识渊博。)

答案 8 :(得分:0)

在C中通常使用的内存管理方式中,跟踪堆的哪些区域是空闲或分配的信息与指示实际使用哪些区域的信息是分开的。当不再需要堆上的信息时,代码必须明确地将其标记为未分配,否则它可能会永久保留。

基于垃圾收集的系统将系统中的所有堆对象引用视为使用对象的权威指示符。因为每次分配对象时扫描系统中的所有对象引用都是不切实际的,系统会有效地“批处理”工作:只要堆上仍然存在空闲内存空间,就可以按顺序将内存分配给对象。在堆变得太满之前,不会尝试回收任何空间。

如果任何线程在局部变量中保存对它的引用,或者如果任何全局变量包含对它的引用,或者如果被认为“used”的对象持有对象的引用,则该对象将被视为“已使用”它在任何领域。编译器通常可以判断是否永远不会实际使用包含对象引用的局部变量,但是它不能使用全局变量或对象字段进行此类确定。如果一个有用的对象拥有一个永远不会再次使用的对象引用,那么该引用应设置为null(VB中为Nothing)。如果没有这样做,只要有用的对象是无用的对象将“保持活着”。如果有用的对象类似于应用程序的主要表单,则结果可能是只要应用程序保持打开状态就会持续存在内存泄漏。

答案 9 :(得分:0)

  

对GC一无所知,从不需要使用它(或者我认为),这是什么样的常见用途,如果我自己提高技能并了解GC的更多信息,我/我的系统如何受益? ?

您可以利用有关垃圾收集的知识来提高您编写的软件的吞吐量和延迟。

  

更新......我怎样才能让GC变得更轻松?

使用值类型来减少堆中的指针数。使用对象树而不是长数组来使堆遍历更加增量并减少延迟。避免将引用写入堆中的mutable,因为这会导致写入障碍并使吞吐量和延迟都恶化。