我正在开发一些应用程序,它使用 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/
答案是:不,这不是一个错误,而是一个功能;)
XmlSerializer 每次调用带有 extraTypes 参数的构造函数时都会创建一个 TempAssembly。并且“程序集不是 GC 堆上的对象,GC 实际上不知道程序集,因此它不会被垃圾收集”
解决方案是将 XmlSerializer 缓存在某个字典中,并且每种类型仅使用一个对象,而不是每次需要时创建新的 XmlSerializer
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)