Tim*_*hko 5 .net c# memory-leaks xmlserializer
我正在开发一些应用程序,它使用 extraTypes 参数调用大量 XmlSerializer 构造函数。我发现,每次调用都会增加大约 100KB 的应用程序内存和 2 个描述符(有时更多)。代码示例:
此代码将应用程序内存增加 100KB,每次调用增加 2 个处理程序
while (true)
{
Console.ReadLine();
new XmlSerializer(typeof (object), new Type[] {});
}
Run Code Online (Sandbox Code Playgroud)
此代码增加了 43024KB 和 2004 个处理程序的应用程序内存
for (var i = 0; i < 1000; i++)
{
new XmlSerializer(typeof (object), new Type[] {});
}
Run Code Online (Sandbox Code Playgroud)
这只是控制台应用程序最简单的示例:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是 XmlSerializer 中的错误还是我做错了什么?
PS 与优化代码和发布版本相同
好的,msdn 上已经有答案https://blogs.msdn.microsoft.com/tess/2006/02/15/net-memory-leak-xmlserializing-your-way-to-a-memory-leak/
\n\n答案是:不,这不是一个错误,而是一个功能;)
\n\nXmlSerializer 每次调用带有 extraTypes 参数的构造函数时都会创建一个 TempAssembly。并且“程序集不是 GC 堆上的对象,GC 实际上不知道程序集,因此它不会\xe2\x80\x99t 被垃圾收集”
\n\n解决方案是将 XmlSerializer 缓存在某个字典中,并且每种类型仅使用一个对象,而不是每次需要时创建新的 XmlSerializer
\n