我正在用C#構建一個不錯的軟件。目標版本:.net 4.5。核心工作之一是構建一個文件列表(包含在根文件夾中的各個目錄和子目錄中),然後一次壓縮一個文件。.net 4.5 ZipArchive - 我的軟件或庫中有內存泄漏嗎?
我正在使用ZipArchive類包含在裏面System.IO.Compression;
下面的代碼:
// 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
這是我身邊已經發現了那麼一點點的代碼。 (可能)說這段代碼包含在一個包含在靜態類中的方法中,並從WPF窗口中調用是很重要的。在這個代碼中使用的所有列表都是靜態類本身聲明的靜態私有列表,所以它們將保留在內存中。
有什麼問題?
當軟件開始時(步驟1),它對RAM的內存影響很小(就像所有普通的小軟件一樣)。在所有文件被壓縮後,最終到達結尾(步驟2),軟件已經採用了大量內存並且永遠不釋放它。
如果我嘗試壓縮一個非常大的文件夾(大約400 MB),軟件將在RAM上保留(即使方法完成時)將近1GB!如果我嘗試更大的文件夾,它會簡單地崩潰(System.OutOfMemoryException)。
只有當我用小文件夾再次運行該方法時,該軟件才能釋放內存。
起初我以爲內存泄漏是由內存中保存的大量文件引起的。然後我使用了Visual Studio內存測試工具,並且我發現所有這些大內存都屬於ZipArchive類,所以我無法進行更深入的調試。
我做錯了什麼或只是ZipAchive庫不夠好,我不得不做什麼?
如果這是最後一個:存在一些更好的.zip庫免費使用,沒有太多的許可證約束?
Zip更新方法將保留可能導致內存泄漏的舊文件和新文件。 – jdweng