我有以下代码:
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
语句中执行的。 最佳答案
尝试将您的代码包装到一个函数中。
看一下this blogpost:
棘手的一点是,变量一旦
不再使用了。但是,由JIT来确定是否
真的想报告变量已死。实际上,对于
可调试代码,JIT将每个变量的生存期延长到
功能。
这意味着GC.Collect
不会收集您的变量,因为您的变量位于同一函数中,并且在调试时仍在作用域内。
请记住:垃圾收集器仅删除未使用的变量(不在范围内)。 using
仅在对象上调用Dispose
。
关于c# - 仅在 Debug模式下发生内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44380194/