【问题标题】:XmlSerializer extraTypes memory leakXmlSerializer extraTypes 内存泄漏
【发布时间】:2016-08-11 09:25:20
【问题描述】:

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

附:与优化代码和发布版本相同

【问题讨论】:

标签: c# .net memory-leaks xmlserializer


【解决方案1】:

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

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

XmlSerializer 每次调用带有 extraTypes 参数的构造函数都会创建一个 TempAssembly。并且“程序集不是 GC Heap 上的对象,GC 真的不知道程序集,所以它不会被垃圾回收”

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

【讨论】:

  • 是的,另一种方法是在新的 AppDomain 中处理您的代码并在处理后卸载 appDomain。因此,您将摆脱这个临时程序集。刚刚调试了 XmlSerializer 并准确地看到了你在回答中所说的,好问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2013-01-20
  • 2011-10-31
  • 2019-08-10
相关资源
最近更新 更多