封闭的 XML。 Workbook.Save() 时内存泄漏

ClosedXML. Memory leak while Workbook.Save()

我需要从数据表中添加新的工作表。对于此任务,我使用 ClosedXML:

workbook.Worksheets.Add(dataTable);
workbook.Save();
workbook = new XLWorkbook(filePath); //reload file to avoid exception at next saving

我的进程使用了​​ 128 Mb 的内存,但在 Workbook.Save() 之后这个数字上升到 382 Mb。添加下一个工作表后,内存使用量从 464 Mb 上升到 619 Mb。但此时的实际文件是 1.6 Mb。

这可能是什么原因?

XLWorkbook 实现了 IDisposable ,你应该调用它来释放它拥有的任何资源。如果你不这样做——它们只会在实例被垃圾回收时被释放(假设 XLWorkbook 实现了正确的终结器),这将在未来的某个时间发生。你应该这样做:

workbook.Save();
workbook.Dispose(); // < important
workbook = new XLWorkbook(filePath);

当然更好的方法是将 workbook 包装到 using 语句中或至少使用 tryfinally 以确保在异常时释放,但这不是直接的与问题相关。

升级到最新版本 ClosedXML,现阶段为 v0.87。 运行配置Release中的代码,配置好XLWorkbook后添加如下代码:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

您应该注意到内存下降到可接受的水平。