gpt4 book ai didi

c# - XmlSerializer.FromTypes 产生内存泄漏?

转载 作者:行者123 更新时间:2023-11-30 16:46:51 25 4
gpt4 key购买 nike

根据 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 方法也会产生内存泄漏吗?

最佳答案

我稍微更改了您的代码 - 运行循环 3000 次而不是 1000 次并将序列化数据写入内存流而不是文件,并使用 dotMemory 对其进行分析。 (我用VS发现RuntimeType实例泄露了,但是没找到怎么查看它们是在哪里创建的)。

最后,应用程序占用了大约 1Mb 的内存(我没有收到您屏幕截图中 500Mb 的结果),但这显然是这里的泄漏。 enter image description here

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

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

所以,答案是“是的,这个方法会产生内存泄漏”

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

---------- 1 --------------分配:2985 个对象中的 83580 B

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()System.Reflection.Emit.TypeBuilder.CreateType()System.Xml.Serialization.XmlSerializationWriterILGen.GenerateEnd()System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly()折叠元素[所有线程根]

---------- 2 --------------分配:2984 个对象中的 83552 个 B

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()System.Reflection.Emit.TypeBuilder.CreateType()System.Xml.Serialization.XmlSerializationReaderILGen.GenerateEnd()System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly()折叠元素[所有线程根]

------------ 3 --------------分配:2984 个对象中的 83552 个 B

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()System.Reflection.Emit.TypeBuilder.CreateType()System.Xml.Serialization.XmlSerializationILGen.GenerateBaseSerializer()System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly()折叠元素[所有线程根]

------------ 4 --------------分配:2984 个对象中的 83552 个 B

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()System.Reflection.Emit.TypeBuilder.CreateType()System.Xml.Serialization.XmlSerializationILGen.GenerateTypedSerializer()System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly()折叠元素[所有线程根]

---------- 5 --------------分配:2984 个对象中的 83552 个 B

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()System.Reflection.Emit.TypeBuilder.CreateType()System.Xml.Serialization.XmlSerializationILGen.GenerateSerializerContract()System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly()折叠元素[所有线程根]

关于c# - XmlSerializer.FromTypes 产生内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40113732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com