封闭的 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
语句中或至少使用 try
和 finally
以确保在异常时释放,但这不是直接的与问题相关。
升级到最新版本 ClosedXML
,现阶段为 v0.87
。 运行配置Release
中的代码,配置好XLWorkbook
后添加如下代码:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
您应该注意到内存下降到可接受的水平。
我需要从数据表中添加新的工作表。对于此任务,我使用 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
语句中或至少使用 try
和 finally
以确保在异常时释放,但这不是直接的与问题相关。
升级到最新版本 ClosedXML
,现阶段为 v0.87
。 运行配置Release
中的代码,配置好XLWorkbook
后添加如下代码:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
您应该注意到内存下降到可接受的水平。