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

标签 silverlight com memory-leaks

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

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

运行 Silverlight 应用程序时,进程内存使用量不断增长。探查器显示托管内存没有增加,表明 Silverlight 运行时/COM 实现中存在泄漏。

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

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

最佳答案

查看您的代码,您来回传递的字符串是(11 个字符 + 终止零)= Unicode 中的 24 个字节。在 COM 自动化中,使用 BSTR 为前导指针(32 位)添加 4 个字节,然后将其乘以 10000,即 10000 * 28 = 280000 个字节。

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

这也许是您应该检查的内容。要测试的一件简单事情是减小 BigMessage 的大小。您还可以使用 WinDBG 深入了解:http://blogs.msdn.com/b/tess/archive/2008/08/21/debugging-silverlight-applications-with-windbg-and-sos-dll.aspx并检查幕后到底发生了什么。

关于silverlight - 为什么 Silverlight 在使用 COM 时会泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4226701/

相关文章:

wpf - "The name ' InitializeComponent ' does not exist in the current context"- 用于新的 WPF 项目

silverlight - 如何暂时禁用 Silverlight 3 导航栏中的页面链接?

.net - Silverlight和桌面应用程序之间如何通信?

c++ - JavaScript 和 VBScript 中与 GetObject 等效的 C++ 是什么?

c++ - 为什么WinDbg在测试内存泄漏程序时总是返回相同的 "!heap -s"信息?

silverlight - 递归silverlight Element finder扩展方法

windows - 如何在 COM 组件中创建线程?

.net - AxInterop和Interop有什么区别?

linux - 写出 libjpeg 图像时内存泄漏

android - 数据绑定(bind)内存泄漏