XmlSerializer.FromTypes产生内存泄漏? [英] XmlSerializer.FromTypes producing memory leaks?

查看:180
本文介绍了XmlSerializer.FromTypes产生内存泄漏?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

According to MSDN XmlSerializer Class section "Dynamically Generated Assemblies" the XmlSerializer produces memory leaks when using certain constructors. I wonder if the

XmlSerializer.FromTypes(Type[])

方法也会产生内存泄漏?

method produces memory leaks, too?

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

I'm experiencing memory problems, when using the FromTypes method. So i started some investigations:

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的诊断工具显示以下内容:

After executing the above code a few times the diagnostic tools of Visual Studio 2015 show the following:

诊断工具图像

垃圾收集器正在运行,但似乎动态生成的程序集正在淹没内存.知道FromTypes方法在内部使用哪个构造函数会很有趣.因此,FromTypes方法也会产生内存泄漏吗?

The garbage collector runs, but it seems like the dynamically generated assemblies are flooding the memory. It would be interesting to know which constructor the FromTypes method internally uses. So, the FromTypes method produces memory leaks, too?

推荐答案

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

I slightly changed your code - run a loop 3000 times instead of 1000 and write serialized data into memory stream instead of file, and profile it with dotMemory. (I found using VS that RuntimeType instances are leaked, but did not find how to see where they were created).

最后,应用程序占用了大约1Mb的内存(如您的屏幕截图所示,我没有收到500Mb的结果),但显然这是一个泄漏.

At the end app occupied about a 1Mb of memory (I did not received a result of 500Mb as on your screenshot) but it's obviously a leak here.

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

Then opened all new objects created between the first and the fourth snapshots placed in Gen2 heap and found out that most of them are (as I mentioned above) instances of RuntimeType.

打开它们,发现其中有五个几乎相等大小的组.

Opened them and saw that there are five almost equal sized groups of them.

因此,答案是是的,此方法会产生内存泄漏"

So, the answer is "yes, this method produces a memory leak"

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

Below five stack traces where these objects were allocated

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

--------- 1 -------------- Allocated: 83580 B in 2985 objects

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

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() System.Reflection.Emit.TypeBuilder.CreateType() System.Xml.Serialization.XmlSerializationWriterILGen.GenerateEnd() System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly() Folded items [AllThreadsRoot]

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

--------- 2 -------------- Allocated: 83552 B in 2984 objects

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

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() System.Reflection.Emit.TypeBuilder.CreateType() System.Xml.Serialization.XmlSerializationReaderILGen.GenerateEnd() System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly() Folded items [AllThreadsRoot]

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

--------- 3 -------------- Allocated: 83552 B in 2984 objects

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

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() System.Reflection.Emit.TypeBuilder.CreateType() System.Xml.Serialization.XmlSerializationILGen.GenerateBaseSerializer() System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly() Folded items [AllThreadsRoot]

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

--------- 4 -------------- Allocated: 83552 B in 2984 objects

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

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() System.Reflection.Emit.TypeBuilder.CreateType() System.Xml.Serialization.XmlSerializationILGen.GenerateTypedSerializer() System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly() Folded items [AllThreadsRoot]

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

--------- 5 -------------- Allocated: 83552 B in 2984 objects

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

System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() System.Reflection.Emit.TypeBuilder.CreateType() System.Xml.Serialization.XmlSerializationILGen.GenerateSerializerContract() System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly() Folded items [AllThreadsRoot]

这篇关于XmlSerializer.FromTypes产生内存泄漏?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆