【发布时间】:2017-02-10 18:19:22
【问题描述】:
我正在使用 C# 构建一个不错的软件。目标版本:.net 4.5。其中一项核心工作是构建文件列表(包含在根文件夹内的各种目录和子目录中),然后一次压缩一个。
我正在使用 System.IO.Compression 中包含的 ZipArchive 类;
代码如下:
// STEP 1
using (var fs = new FileStream(destination_path + "\\" + zipname + ".zip", FileMode.OpenOrCreate))
{
using (var zip = new ZipArchive(fs, ZipArchiveMode.Update))
{
// Some non important thing
foreach (string single_file in list_file_tobackup)
{
// non important things
zip.CreateEntryFromFile(single_file, temp);
}
}
}
// STEP 2
这是我在 SO 上找到的一小段代码。重要的是要说(也许)此代码包含在静态类中包含的方法中,并从 WPF 窗口调用。此代码中使用的所有列表都是在静态类本身中声明的静态私有列表,因此它们将保留在内存中。
有什么问题?
当软件在开始时(第 1 步),它对 RAM 的内存影响非常小(就像所有普通的小软件一样)。在所有文件被压缩并最终到达结尾(第 2 步)之后,该软件占用了一大堆内存并且永远不会释放它。
如果我尝试压缩一个非常大的文件夹(大约 400 MB),软件会占用并保留(即使方法完成后)将近 1GB 的 RAM!如果我尝试一些更大的文件夹,它只会崩溃(System.OutOfMemoryException)。
只有在我用一个小文件夹再次运行该方法时,该软件才能释放内存。
起初我认为内存泄漏是由内存中维护的大文件列表引起的。然后我使用了 Visual Studio 内存测试工具,我发现所有那一大块内存都属于 ZipArchive 类,所以我无法更深入地调试。
我做错了什么,或者只是 ZipAchive 库不足以完成我必须做的事情?
如果是最后一个:是否存在一些更好的 .zip 库,可以免费使用而没有太多的许可限制?
【问题讨论】:
-
Zip 更新方法将保留可能导致内存泄漏的新旧文件。
标签: c# .net wpf memory-leaks