根据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的诊断工具显示如下:
垃圾收集器运行,但似乎动态生成的程序集充斥着内存。知道FromTypes
方法内部使用哪个构造函数会很有趣。那么,FromTypes
方法也会产生内存泄漏?
答案 0 :(得分:2)
我略微改变了你的代码 - 运行循环3000次而不是1000次,并将序列化数据写入内存流而不是文件,并使用dotMemory对其进行分析。 (我发现使用VS的RuntimeType实例被泄露,但没有找到如何查看它们的创建位置。)
最后,app占用了大约1Mb的内存(我没有收到你的截图中500Mb的结果),但这显然是泄密。
然后打开在Gen2堆中放置的第一个和第四个快照之间创建的所有新对象,并发现它们中的大多数(如上所述)是RuntimeType的实例。
所以,答案是&#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]