C#垃圾收集

时间:2011-05-05 11:05:15

标签: c# garbage-collection

我有一个我编写的业务应用程序,可以通过目录结构有效地查找特定的Excel文件,并存储它们的地址。然后它循环遍历这些文件并通过为每个文件创建一个DocumentParser对象来解析它们,这是一次完成一个,而不是异步。该软件似乎非常稳定,以至于企业希望通过包含超过10000个相关Excel文件的大型目录来运行它。

我的问题是,当我每次创建一个新的DocumentParser对象时,GC是否足够有效,当它们超出范围时丢弃每个对象,即当该Excel表已被解析时,或者是否有我可以监控这个并在必要时手动执行GC吗?我以前从未处理过如此大量的数据,通常一次只能测试最多40-50个Excel文件。

感谢。

4 个答案:

答案 0 :(得分:4)

GC是一个非常复杂的软件。 GC至少是唯一知道什么时候需要垃圾收集的人。所以我的建议是将GC留在自己的位置。

此外:GC将处理这些质量对象。也许你会认识到性能下降。如果这是一个问题,您可以尝试优化您的代码。但不是过早的。

答案 1 :(得分:2)

我会把GC留给它做生意。 10,000个对象对GC来说并不是很有用。 GC工作的成本可能远低于Excel工作的成本。因此,为GC调整内容并不值得使您的设计复杂化。如果您最终要处理的文件太多,以至于您的应用程序无法及时完成,那么最有可能是Excel处理的速度阻碍您。

然而,一个可能相关的注释:如果DocumentParser在使用Excel文件时使用非托管内存,则可以使用GC.Add / RemoveMemoryPressure向GC指示打开文件时实际增加的成本。如果您没有自己编写DocumentParser,则作者可能已经在执行此操作。

这里的问题是,您可能有一个托管对象,其成本大约为100字节,在Excel工作时会分配大量非托管内存。 GC无法知道这一点,因此这些方法有助于通知GC,内存压力超出了解意。这可能会改变其决定收集的方式/时间,这可能会导致应用程序维持较低的内存占用。如果应用程序的内存使用量随着时间的推移而膨胀,那么您可能会从长度垃圾收集和可能在机器上进行分页(这取决于您拥有多少内存)开始看到一些减速。您需要密切关注其内存使用情况,以确保它在处理过程中不会泄漏内存 - 内存分析器可能会对此有所帮助。

答案 2 :(得分:1)

您不需要手动调用GC,除非您持有一些非常大的资源,而在您的情况下并非如此。 GC会在每次调用时自行调整,如果您手动调用它,您将只会中断其内部分析数据。

BTW GC不仅可以在超出范围时收集内容,也可以在最后一次使用后(即,当它仍然在范围内但不再使用该变量时)收集内容。

答案 3 :(得分:1)

是和否 - GC足够有效,可以在需要时发布,但通常无法确定何时发生。

有一种强制GC集合的方法,但它通常被认为是生产代码中的错误做法,因为当不需要时强制堆栈遍历的效果比使用一些额外的内存更糟糕,直到GC决定它为止需要释放资源来分配更多的对象。