我有这段代码:
using (var memoryStream = new MemoryStream())
{
using (var streamWriter = new StreamWriter(memoryStream))
{
var list = new List<Actor>();
for (var i = 0; i < 1000000; i++)
{
list.Add(new Actor("lorem ipsum"));
}
using (var serializedContent = new MemoryStream())
{
streamWriter.WriteLine(JsonConvert.SerializeObject(list));
streamWriter.Flush();
serializedContent.Seek(0, SeekOrigin.Begin);
using (ZipFile zip = new ZipFile())
{
zip.AddEntry("message.txt", serializedContent);
zip.Save("Archive.zip");
}
}
}
}
while (true)
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.WaitForFullGCComplete();
GC.Collect();
Console.WriteLine("completed");
Console.ReadKey();
}
问题是内存泄漏只出现在调试版本中,而在发布时它会完全清除。任何想法为什么会发生这种情况?
修改
我注意到,如果我删除那个尝试将文件添加到zip存档的部分,问题就会消失。使用此代码的调试版和发行版之间可能有什么区别?我无法看到问题,因为归档部分是在using
语句中执行的。
答案 0 :(得分:2)
尝试将代码包装到函数中。
棘手的一点是,变量一旦被认定就有资格死亡 不再使用了。但是,由JIT确定是否可以 真的想报告变量是死的。事实上,为 可调试代码,JIT将每个变量的生命周期延长到 功能
这意味着您的变量不会被GC.Collect
收集,因为您的变量位于同一个函数中且调试时仍在范围内。
请记住:垃圾收集器只删除未使用的变量(不在范围内)。 using
仅在对象上调用Dispose
。