【问题标题】:Are there still known memory leaks with XML serialization in .NET 4?.NET 4 中的 XML 序列化是否仍然存在已知的内存泄漏?
【发布时间】:2013-08-28 11:26:58
【问题描述】:

我们的应用程序正在泄漏内存。 我们还没有在它上面运行内存分析器。我在 CLR 2(.NET 2、.NET 3.5)中发现了大量关于该漏洞的博客文章和其他内容。 所以我想知道是否有人知道这是否仍然是 CLR 4 (.NET 4) 中的问题..

(我在 SO 上找到了这个:Are there still known memory leaks with XMLSerialization in .Net 3.5?

【问题讨论】:

  • 您在使用XmlAttributeOverrides 吗?如果您是:需要小心处理...与其说是渗漏,不如说是:如果使用不正确,它会出血;如果使用正确:它不会
  • 在我将矛头指向雷德蒙德之前,我会寻找自残的,我不是他们最大的粉丝之一......
  • 我不是故意指指点点 :) 我只知道 CLR 2 中的问题,想知道是否有人在 CLR 4 中遇到过这个问题。@Marc:不使用那个。当我们会自己找到答案,我会在这里报告:)
  • “问题”并不普遍,就像假装整个事情完全是错误的,而且微软没有人不在乎。只有在特定情况下,Xml 序列化的架构存在缺陷需要考虑。
  • 这个问题是设计使然,它永远不会改变。这不是一个错误。将 XmlSerializer 视为一种昂贵的资源,最好将其放入静态字段或其他缓存中。

标签: .net memory-leaks xml-serialization


【解决方案1】:

我可以确认 XmlSerializer 的行为仍与旧 .NET 版本相同。 解决此泄漏的一种方法是实现一个小的缓存机制,如下所述:

XmlSerializer Performance Issue when Specifying XmlRootAttribute

【讨论】:

    【解决方案2】:

    我在 SO 上找到的最佳答案是: https://stackoverflow.com/a/36123026/2941313

    如果你关注the link到关于XmlSerializer的msdn页面,依然可以看到这条评论:

    为了提高性能,XML 序列化基础结构动态生成程序集以序列化和反序列化指定类型。基础结构查找并重用这些程序集。此行为仅在使用以下构造函数时发生:

    • XmlSerializer.XmlSerializer(Type)
    • XmlSerializer.XmlSerializer(Type, String)

    如果您使用任何其他构造函数,则会生成同一程序集的多个版本并且永远不会卸载,这会导致内存泄漏和性能下降。最简单的解决方案是使用前面提到的两个构造函数之一。否则,您必须将程序集缓存在 Hashtable 中,如下例所示。

    并且有一些正确使用的示例...所以我想,答案是肯定的,但是您可以解决这些内存问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      相关资源
      最近更新 更多