我稍微更改了您的代码 - 运行循环 3000 次而不是 1000 次,并将序列化数据写入内存流而不是文件,并使用 dotMemory 对其进行分析。 (我使用 VS 发现 RuntimeType 实例被泄露,但没有找到如何查看它们的创建位置)。
最终应用程序占用了大约 1Mb 的内存(我没有收到您屏幕截图中 500Mb 的结果),但这显然是这里的泄漏。
然后打开在 Gen2 堆中的第一个和第四个快照之间创建的所有新对象,发现它们中的大多数(如上所述)是 RuntimeType 的实例。
打开它们,发现它们有五个大小几乎相等的组。
所以,答案是“是的,这种方法会产生内存泄漏”
在分配这些对象的五个堆栈跟踪下方
--------- 1 --------------
已分配:2985 个对象中的 83580 B
System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
System.Reflection.Emit.TypeBuilder.CreateType()
System.Xml.Serialization.XmlSerializationWriterILGen.GenerateEnd()
System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly()
折叠物品
[AllThreadsRoot]
------ 2 --------------
已分配:2984 个对象中的 83552 B
System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
System.Reflection.Emit.TypeBuilder.CreateType()
System.Xml.Serialization.XmlSerializationReaderILGen.GenerateEnd()
System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly()
折叠物品
[AllThreadsRoot]
--------- 3 --------------
已分配:2984 个对象中的 83552 B
System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
System.Reflection.Emit.TypeBuilder.CreateType()
System.Xml.Serialization.XmlSerializationILGen.GenerateBaseSerializer()
System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly()
折叠物品
[AllThreadsRoot]
--------- 4 --------------
已分配:2984 个对象中的 83552 B
System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
System.Reflection.Emit.TypeBuilder.CreateType()
System.Xml.Serialization.XmlSerializationILGen.GenerateTypedSerializer()
System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly()
折叠物品
[AllThreadsRoot]
--------- 5 --------------
已分配:2984 个对象中的 83552 B
System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
System.Reflection.Emit.TypeBuilder.CreateType()
System.Xml.Serialization.XmlSerializationILGen.GenerateSerializerContract()
System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly()
折叠物品
[AllThreadsRoot]