.NET中的OutOfMemoryException在XMLSerializer.Serialize时发生

8

我有一个网站,每当它到达代码中的以下位置时,就会抛出OutOfMemoryExceptions:

XmlSerializer xs = new XmlSerializer(t, xoverrides);

由于这种情况仅在Web服务器上发生,我没有太多关于为什么会发生这种情况的信息。我知道进行序列化的对象不是什么严重的问题--每个对象明显少于1MB。

你曾经遇到过这种情况吗?能否帮助我诊断一下问题?非常感谢您的帮助。

谢谢!

2个回答

14

OutOfMemoryException不是由被序列化的对象引起的,而是由XmlSerializer对象的构建导致的。创建XmlSerializer时,会动态生成一个程序集并加载到AppDomain中。这些程序集直到它们所在的AppDomain卸载后才能进行垃圾回收,而在您的情况下永远不会卸载。根据使用的XmlSerializer构造函数,每个被构造的XmlSerializer都将动态生成一个新的程序集。随着时间的推移,这些程序集将消耗所有可用的内存。

有几种解决方法:

  1. 缓存您创建的XmlSerializer。
  2. 使用其中一种实现缓存的XmlSerializer构造函数重载。看起来您正在使用不实现缓存的XmlSerializer(Type, XmlAttributeOverrides)。XmlSerializer(Type)和XmlSerializer(Type, string)实现了缓存。

Microsoft KB : 在ASP.NET中创建多个XmlSerializer对象时内存使用量很高


嗨,我在使用“new XmlSerializer(o.GetType());”时遇到了类似的问题。当我在本地机器上序列化非常大的数据时,我会遇到这个问题,在云服务器上托管的实时应用程序上没有任何异常。但是在开发过程中,我无法进一步使用和测试序列化字符串。我愿意听取建议。 - Hitesh Gaur

0
如果我记得以前类似的问题,XmlSerializer 需要比它处理的数据更多的内存。不过我不确定为什么会这样。

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