c#垃圾收集
本文关键字: | 更新日期: 2023-09-27 17:54:46
我编写了一个商业应用程序,它有效地递归通过目录结构查找特定的Excel文件,并存储它们的地址。然后,它循环遍历这些文件,并通过为每个文件创建DocumentParser对象来解析它们,这是一次完成一个,而不是异步的。该软件似乎非常稳定,以至于企业希望运行它来递归遍历包含超过10000个相关Excel文件的大目录。
我的问题是,当我每次创建一个新的DocumentParser对象时,GC是否足够有效,以便在超出范围时丢弃每个对象,即当Excel工作表被解析时,或者是否有一种方法我可以监控这一点,并在必要时手动执行GC?我以前从来没有处理过这么大量的数据,通常一次只在最多40-50个Excel文件上进行测试。
谢谢。
GC是一个非常复杂的软件。而GC至少是唯一知道什么时候需要垃圾收集的。所以我的建议是让GC自生自灭。
另外:GC将处理这些大质量对象。也许您会发现性能下降了。如果这是一个问题,您可以尝试优化您的代码。
我会让GC去做它自己的事情。对于GC来说,10,000个对象的工作量并不大。而且GC工作的成本很可能比Excel工作的成本低得多。因此,不值得为GC调整一些东西而使设计复杂化。如果你最终有很多文件要处理,你的应用程序无法及时完成,很可能是Excel处理的速度拖了你的后腿。
然而,一个可能相关的注意事项:如果DocumentParser在处理Excel文件时使用非托管内存,您可以使用GC。Add/removemmemorypressure向GC显示打开文件时实际增加的开销。如果您没有自己编写DocumentParser,那么作者可能已经这样做了。
这里的问题是,你可能有一个托管对象,花费的东西在100字节的顺序,这分配了大量的非托管内存当它做Excel工作。GC将无法知道这一点,因此这些方法有助于通知GC存在比它所知道的更多的内存压力。这可能会改变其决定收集的方式/时间的行为,这可能导致应用程序维护更低的内存占用。如果应用程序的内存使用随着时间的推移而膨胀,那么您可能会开始看到长度垃圾收集和机器上的分页出现一些变慢(取决于您有多少内存)。您将需要密切关注它的内存使用情况,以确保它在处理过程中不会泄漏内存-内存分析器可能会有所帮助。
您不需要手动调用GC,除非您持有一些非常大的资源,而在您的情况下并非如此。GC每次调用都会调整自己,如果你手动调用它,你只会破坏它的内部分析数据。
BTW GC不仅可以收集超出作用域的内容,还可以收集最后一次使用之后的内容(即当它仍在作用域内但变量不再使用时)。
是或否- GC足够有效,可以在需要时释放,但通常不能确定何时释放。
有一种强制GC收集的方法,但它通常被认为是生产代码中的坏做法,因为在不需要的时候强制堆栈遍历的效果比使用一点额外的内存更糟糕,直到GC决定需要释放资源来分配更多的对象。