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或我做错了什么?

注。同样,优化代码和发布构建

XmlSerializer extraTypes内存泄漏

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