繁体   English   中英

C# 垃圾回收

[英]C# garbage collection

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

My question is, as I am creating a new DocumentParser object each time, will the GC be effective enough to discard each of the objects when they go out of scope, ie when that Excel sheet has been parsed, or is there a way I can监控这一点并在必要时手动执行 GC? 我以前从未处理过如此大量的数据,通常一次最多只能在 40-50 个 Excel 文件上进行测试。

谢谢。

GC 是一个非常复杂的软件。 GC 至少是唯一知道何时需要进行垃圾收集的。 所以我的建议是让 GC 自行处理。

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

我会把 GC 留给它自己做。 10,000 个对象对于 GC 来说并不算多。 GC 工作的成本很可能远低于 Excel 工作的成本。 所以不值得让你的设计复杂化来调整 GC 的东西。 如果您最终要处理的文件太多,以至于您的应用程序无法及时完成,那么很可能是 Excel 处理的速度阻碍了您。

但是有一点可能相关:如果 DocumentParser 在处理 Excel 文件时使用非托管 memory,您可以使用 GC.Add/RemoveMemoryPressure 向 GC 指示打开文件时的实际增加成本。 如果您没有自己编写 DocumentParser,那么作者可能已经在这样做了。

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

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

顺便说一句,GC 不仅可以在它超出 scope 时收集东西,而且在它最后一次使用之后(即它仍在 scope 中但不再使用该变量)。

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

有一种方法可以强制进行 GC 收集,但通常认为它在生产代码中是不好的做法,因为在不需要时强制堆栈遍历的效果比在 GC 决定需要释放之前使用一点额外的 memory 更糟糕资源分配更多的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM