我们在Out Of Browser Silverlight应用程序中托管旧版COM组件时发现了这个问题,首先认为这是我们的COM组件的一个问题。
然而,将其缩小到托管可以想象的最基本的COM组件仍会导致内存泄漏。这个用于测试的COM组件是用.NET编写的,每次定时器触发时都会将事件发送回Silverlight应用程序。每个事件仅包含一个字符串。
运行Silverlight应用程序时,进程内存使用量不断增长。 Profilers显示托管内存没有增加,表明Silverlight运行时/ COM实现存在泄漏。
有没有其他人看过这个问题,如果有,你能解决这个问题吗?
可以使用Repro项目答案 0 :(得分:1)
查看您的代码,您传回的字符串&四是(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并查看封面下的内容。
答案 1 :(得分:0)
确保COM组件释放它分配的任何字符串。
答案 2 :(得分:0)
不熟悉Silverlight,但是互操作头痛的另一个可能原因是事件处理:http://www.codeproject.com/KB/cs/LingeringCOMObjects.aspx
答案 3 :(得分:0)
是否存在本地资源而非垃圾收集?也许这是非常少数情况之一,其中调用GC.Collect可能是有益的。有趣的阅读here
只是为了测试你可以调用GC.Collect一对(甚至三次),看看会发生什么(我不相信我实际上是在暗示这一点......)。