XmlSerializer extraTypes内存泄漏
本文关键字:泄漏 内存 extraTypes XmlSerializer | 更新日期: 2023-09-27 18:02:08
我正在开发一些应用程序,它调用了许多带extraTypes参数的XmlSerializer构造函数。我发现,每次调用会增加大约100KB的应用程序内存和2个描述符(有时更多)。代码示例:
此代码为每个调用增加了100KB的应用程序内存和2个处理程序
while (true)
{
Console.ReadLine();
new XmlSerializer(typeof (object), new Type[] {});
}
这段代码为43024KB和2004个处理程序增加了应用程序内存
for (var i = 0; i < 1000; i++)
{
new XmlSerializer(typeof (object), new Type[] {});
}
这是最简单的控制台应用程序的例子:
internal class Program
{
private static void Main(string[] args)
{
//this code encrease application memory for 43024KB and 2004 handlers
for (var i = 0; i < 1000; i++)
{
new XmlSerializer(typeof (object), new Type[] {});
}
Console.WriteLine("Finished. Press any key to continue...");
Console.ReadLine();
}
}
这是一个错误在XmlSerializer或我做错了什么?
注。同样,优化代码和发布构建
msdn上已经有答案了https://blogs.msdn.microsoft.com/tess/2006/02/15/net-memory-leak-xmlserializing-your-way-to-a-memory-leak/
简短的回答是:不,这不是一个bug,这是一个功能;)
XmlSerializer在每次调用带有extraTypes参数的构造函数时创建一个tempassemassembly。"程序集不是GC堆上的对象,GC真的不知道程序集,所以它不会被垃圾收集"
解决方案是在某些字典中缓存XmlSerializer,并且每种类型只使用一个对象,而不是每次需要时都创建新的XmlSerializer