XmlSerializer extraTypes内存泄漏

时间:2016-08-11 09:25:20

标签: c# .net memory-leaks xmlserializer

我正在开发一些应用程序,它使用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中的错误还是我做错了什么?

P.S。与优化代码和发布版本相同

1 个答案:

答案 0 :(得分:4)

好的,msdn https://blogs.msdn.microsoft.com/tess/2006/02/15/net-memory-leak-xmlserializing-your-way-to-a-memory-leak/

上已有答案

拍摄答案是:不,它不是错误,它是一个特征;)

XmlSerializer每次使用extraTypes parametr调用构造函数时都会创建一个TempAssembly。并且“程序集不是GC堆上的对象,GC实际上并不知道程序集,因此不会收集垃圾”

解决方法是将XmlSerializer缓存在某些字典中,每种类型只使用一个对象,而不是每次需要时都创建新的XmlSerializer