8

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

XmlSerializer xs = new XmlSerializer(t, xoverrides);

看到只有在 Web 服务器上才会发生这种情况,我没有太多关于为什么会发生这种情况的信息。我知道它正在序列化的对象并不太严重——每个对象肯定小于一个 MB。

你以前有过这个吗?想帮我诊断问题吗?任何帮助表示赞赏。

谢谢!

4

2 回答 2

12

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

有几个解决方案:

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

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

于 2010-05-18T23:03:25.253 回答
0

如果我回想起不久前的类似问题,XmlSerializer 需要大量内存而不是其处理的数据。我不确定为什么会这样。

于 2010-05-10T19:23:11.530 回答