代码之家  ›  专栏  ›  技术社区  ›  dustinson

在.NET 3.5中是否仍然存在已知的XML序列化内存泄漏?

  •  5
  • dustinson  · 技术社区  · 16 年前

    本文 http://blogs.msdn.com/tess/archive/2006/02/15/532804.aspx Tess Ferrandez概述了为什么使用XML序列化会导致内存泄漏。

    泄漏是如何在内存中将对象实例化为程序集的结果,而不是对象,因此垃圾收集器不针对这些对象。

    这篇文章最初写在1.0/1.1clr上,但是关于2.0clr的更新还不清楚。

    我正在一个仍处于beta版本的Web应用程序中广泛地使用XML序列化/反序列化,以进行用户界面/服务器交换。对象只是DTO(只有属性的对象)。

    提前谢谢!

    4 回复  |  直到 8 年前
        1
  •  2
  •   Hans Passant    8 年前

    它主要通过.NET 2.0动态方法来解决。但是,如果不使用[xmlroot]属性,仍然有一个失败模式。回顾 this article 详情。

        2
  •  7
  •   JaredPar    16 年前

    实际导致泄漏的部分是,从未收集过XML引擎为序列化目的生成的程序集。从clr 2.0sp1(.net 3.5)开始,情况仍然如此。一旦程序集加载到进程中,它将不会被删除,直到同时卸载包含该程序集的AppDomain。

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

        3
  •  2
  •   csgero    16 年前

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

        4
  •  2
  •   dustinson    16 年前

    谢谢您。似乎键是使用XmlSerializer(类型)并允许内存中的实例保持缓存。如果您将类名别名为,那么缓存将无法工作,并且会发生泄漏。我必须测试和监控以确定我们是否无泄漏。 -达斯廷

    推荐文章