XmlSerializer.FromTypes 会导致内存泄漏吗?

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

您是否遇到了使用此特定方法时的问题?还是这只是一种假设性的推测? - gravity
我在使用这个方法时遇到了内存问题。我在这篇帖子中添加了一些代码和 Visual Studio 诊断工具的结果来展示这种行为。似乎这个方法会产生内存泄漏。 - ttP
请参见:https://dev59.com/ZGAg5IYBdhLWcg3wLYaI - dummy
1个回答

2
我稍微修改了你的代码——将循环次数从1000增加到3000,并将序列化数据写入内存流而不是文件,使用dotMemory进行分析。(我在使用VS时发现RuntimeType实例存在泄漏,但没有找到它们的创建位置)。
最终,应用程序占用了大约1MB的内存(我没有像你的截图上那样收到500MB的结果),但这里显然存在一个泄漏。
然后,打开了第一个和第四个快照之间创建的所有新对象,发现它们中的大部分都是(如上所述)RuntimeType的实例。
打开它们并看到有五个大小几乎相等的组。
因此,答案是“是的,这种方法会产生内存泄漏”。
以下是分配这些对象的五个堆栈跟踪。

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock():创建类型,不加锁。 System.Reflection.Emit.TypeBuilder.CreateType():创建类型。 System.Xml.Serialization.XmlSerializationILGen.GenerateSerializerContract():生成序列化协定。 System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly():生成引用发射程序集。 Folded items:折叠项。 [AllThreadsRoot]:所有线程的根。


1
谢谢你的回答!这证实了我对这个方法的怀疑。现在我正在缓存XmlSerializer实例,以便重复使用它们,避免占用过多内存。 - ttP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接