XmlSerializer.FromTypes产生内存泄漏?

时间:2016-10-18 16:43:13

标签: c# .net memory-leaks xmlserializer

根据MSDN XmlSerializer Class部分"动态生成的程序集"使用某些构造函数时,XmlSerializer会产生内存泄漏。我想知道是否

XmlSerializer.FromTypes(Type[])

方法也会产生内存泄漏?

编辑:

使用FromTypes方法时,我遇到了内存问题。所以我开始进行一些调查:

for (int i = 0; i < 1000; i++)
{
    DummyObject content = new DummyObject()
    {
        Age = 29,
        Location = "London",
        Name = "Pete"
    };
    XmlSerializer serializer = XmlSerializer.FromTypes(new[] { content.GetType() })[0];
    using (TextWriter textWriter = new StreamWriter($@"D:\test\array\{i}.xml"))
    {
        serializer.Serialize(textWriter, content);
    }
}

执行上述代码几次后,Visual Studio 2015的诊断工具显示如下:

Diagnostic Tools Image

垃圾收集器运行,但似乎动态生成的程序集充斥着内存。知道FromTypes方法内部使用哪个构造函数会很有趣。那么,FromTypes方法也会产生内存泄漏?

1 个答案:

答案 0 :(得分:2)

我略微改变了你的代码 - 运行循环3000次而不是1000次,并将序列化数据写入内存流而不是文件,并使用dotMemory对其进行分析。 (我发现使用VS的RuntimeType实例被泄露,但没有找到如何查看它们的创建位置。)

最后,app占用了大约1Mb的内存(我没有收到你的截图中500Mb的结果),但这显然是泄密。 enter image description here

然后打开在Gen2堆中放置的第一个和第四个快照之间创建的所有新对象,并发现它们中的大多数(如上所述)是RuntimeType的实例。 enter image description here

打开它们,看到它们有五个几乎相同大小的组。 enter image description here

所以,答案是&#34;是的,这种方法会产生内存泄漏&#34;

分配这些对象的五个堆栈跟踪

--------- 1 -------------- 分配:83580 B在2985个物体

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() System.Reflection.Emit.TypeBuilder.CreateType() System.Xml.Serialization.XmlSerializationWriterILGen.GenerateEnd() System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly() 折叠物品 [AllThreadsRoot]

--------- 2 -------------- 分配:83552 B in 2984个对象

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() System.Reflection.Emit.TypeBuilder.CreateType() System.Xml.Serialization.XmlSerializationReaderILGen.GenerateEnd() System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly() 折叠物品 [AllThreadsRoot]

--------- 3 -------------- 分配:83552 B in 2984个对象

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() System.Reflection.Emit.TypeBuilder.CreateType() System.Xml.Serialization.XmlSerializationILGen.GenerateBaseSerializer() System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly() 折叠物品 [AllThreadsRoot]

--------- 4 -------------- 分配:83552 B in 2984个对象

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() System.Reflection.Emit.TypeBuilder.CreateType() System.Xml.Serialization.XmlSerializationILGen.GenerateTypedSerializer() System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly() 折叠物品 [AllThreadsRoot]

--------- 5 -------------- 分配:83552 B in 2984个对象

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() System.Reflection.Emit.TypeBuilder.CreateType() System.Xml.Serialization.XmlSerializationILGen.GenerateSerializerContract() System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly() 折叠物品 [AllThreadsRoot]