XmlSerializer extraTypes 内存泄漏

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 与优化代码和发布版本相同

Tim*_*hko 4

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

\n\n

答案是:不,这不是一个错误,而是一个功能;)

\n\n

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

\n\n

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

\n