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

为什么使用COM时Silverlight会泄漏内存?

  •  7
  • SoftMemes  · 技术社区  · 14 年前

    我们在浏览器外的Silverlight应用程序中托管旧的COM组件时发现了这个问题,首先我们认为这是COM组件的问题。

    然而,将范围缩小到托管最基本的COM组件仍然存在内存泄漏。用于测试的COM组件是在.NET中编写的,并且每次计时器触发时只将事件发送回Silverlight应用程序。每个事件只包含一个字符串。

    运行Silverlight应用程序时,进程内存使用率不断增长。配置文件显示托管内存没有增加,这表明Silverlight运行时/COM实现中存在泄漏。

    有没有其他人看到过这个问题,如果有,你能解决它吗?

    编辑: repro项目现在可在 http://bitbucket.org/freed/silverlight-com-leak

    4 回复  |  直到 14 年前
        1
  •  1
  •   Community CDub    8 年前

    查看代码时,返回的字符串(11个字符+终止零)=24字节(Unicode)。在COM自动化中,使用bstr将前导指针(32位)加上4个字节,然后乘以10000,wich为10000*28=280000字节。

    这意味着每毫秒(计时器的值为1),您将分配大量内存,在.NET中,28万字节的块可能会分配给大对象堆(>85000字节)。在大多数情况下,撞击LOH的结果是…内存问题,如这里所示,例如: Large Object Heap Fragmentation

    这也许是你应该检查的东西。要测试的一件简单的事情是减小您的大消息的大小。你也可以用windbg潜水: http://blogs.msdn.com/b/tess/archive/2008/08/21/debugging-silverlight-applications-with-windbg-and-sos-dll.aspx 检查下到底发生了什么。

        2
  •  0
  •   Jeff Yates    14 年前

    确保COM组件正在释放它分配的任何字符串。

        3
  •  0
  •   hythlodayr    14 年前

    不熟悉Silverlight,但Interop难题的另一个可能原因是事件处理: http://www.codeproject.com/KB/cs/LingeringCOMObjects.aspx

        4
  •  0
  •   Francesco De Vittori    14 年前

    是否存在未被垃圾收集的本机资源?也许这是 非常 少数情况下打电话给gc.collect可能会有好处。有趣的阅读 here

    只是为了测试,你可以打电话给gc。收集一些(甚至三次)看看会发生什么(我不敢相信我真的在建议这个…)。