.Net 3.5中是否存在XMLSerialization的已知内存泄漏?

时间:2009-01-22 13:23:22

标签: .net memory-leaks

Tess Ferrandez撰写的这篇文章http://blogs.msdn.com/tess/archive/2006/02/15/532804.aspx概述了为什么使用XMLSerialization会导致内存泄漏。

泄漏是由于对象如何在内存中实例化为程序集而不是对象,因此不是垃圾收集器的目标。

该文章最初是在1.0 / 1.1 CLR上编写的,但有关2.0 CLR的更新尚不清楚。

我正在广泛使用XMLSerialization / Deserialization在仍处于测试阶段的Web应用程序中进行UI /服务器交换。对象只是DTO(仅具有属性的对象)。

提前谢谢!

4 个答案:

答案 0 :(得分:7)

实际导致泄漏的部分是由XML引擎生成的用于序列化目的的程序集不会被收集。从CLR 2.0SP1(.Net 3.5)开始,情况仍然如此。将程序集加载到进程后,在卸载包含该程序集的AppDomain之前,它不会被删除。

如果您注意到文章的底部,她提到了一种让XML引擎重用程序集的方法,这样内存就不会失去控制。

答案 1 :(得分:2)

它主要通过.NET 2.0 DynamicMethod解决。但是,如果不使用[XmlRoot]属性,则仍然存在故障模式。有关详细信息,请查看this article

答案 2 :(得分:2)

我遇到了与2.0相同的问题,所以我可以确认那里仍然存在内存泄漏,但我没有使用3.5的经验。 只要您只使用构造函数XmlSerializer(类型)和XmlSerializer(类型,defaultNameSpace),您就应该是安全的,因为XmlSerializers将自动缓存。如果您使用任何其他构造函数,则必须创建自己的缓存。

答案 3 :(得分:2)

谢谢。似乎关键是使用XmlSerializer(类型)并允许内存中实例保持缓存。看来如果你给类名别名,那么缓存就不起作用了,随之而来的就是漏洞。我将不得不进行测试和监控,以确定我们是否无泄漏。 -Dustin