试图追踪仅在浏览器中发生的Silverlight内存泄漏

试图追踪仅在浏览器中发生的Silverlight内存泄漏,silverlight,memory-leaks,Silverlight,Memory Leaks,这是一个奇怪的问题。我正在制作一个类似于游戏的应用程序,我想有一个流星爆发的效果。有一天晚上我做了,一切都很顺利,直到我注意到我的浏览器消耗了超过300兆内存,每5秒消耗1兆内存,主要是在星暴发生的时候 下面是一个简单的星暴例子: 首先想到的是,我没有删除对象,或者在某个地方仍然有引用。我把生成的每一颗星都放在画布上,但我每3秒移除一次旧的开始。我也有很多DoubleAnimations,但我甚至有一个回调将所有内容设置为null 这里是奇怪的部分,如果我将其转换为WPF,它不会发生,如果我在

这是一个奇怪的问题。我正在制作一个类似于游戏的应用程序,我想有一个流星爆发的效果。有一天晚上我做了,一切都很顺利,直到我注意到我的浏览器消耗了超过300兆内存,每5秒消耗1兆内存,主要是在星暴发生的时候

下面是一个简单的星暴例子:

首先想到的是,我没有删除对象,或者在某个地方仍然有引用。我把生成的每一颗星都放在画布上,但我每3秒移除一次旧的开始。我也有很多DoubleAnimations,但我甚至有一个回调将所有内容设置为null

这里是奇怪的部分,如果我将其转换为WPF,它不会发生,如果我在Silverlight Spy 3内部运行它,它不会发生。如果我使用WinDbg和SOS.dll进行堆转储,它会报告它应该只使用1.8到3 MB的ram

我让GC每3秒运行一次来清理,但它从来没有任何效果。我可以在heapdump中看到许多对象现在都被删除了,在GC之后我总是返回到1.8兆左右,但是任务管理器中显示的内存一直在增加


我不知道该怎么办,我想我正在小心地删除对象,除非我的堆不诚实。

你在运行Vista还是Win7?听起来操作系统并没有回收内存,因为它是这样的。
也可能是Silverlight GC没有释放其缓冲区,假设内存可能需要很快重新分配


不管是哪种情况,只要探查器说您的程序在GC运行后只使用1.8MB,听起来都不需要担心。

我只是简单地查看了一下您的代码。您有很多地方可以钩住事件(+=),但永远不会解开(-=)。这些是硬引用,因此如果它们最终连接到根对象,就永远不会被收集。

好的,我将大致回答我自己的问题。Silverlight没有方便的“BeginAnimation”方法,所以我在网上找到了一种快速的方法来添加一个扩展来完成基本相同的事情,它通过创建一个故事板并启动它来实现

然而,它只是停留在那里,我也不知道它到底连接到了什么。在它完成后调用Stop()修复了我的内存问题


一个奇怪的副作用是,当我调用stop方法时,我必须小心,当创建如此多的故事板时,它似乎有点混乱,它会导致一些对象重新出现,即使在它们从控件中移除之后

这是来源:它不允许我将其添加到上面的新操作系统中:(你使用的是哪种操作系统?任务管理器与XP到Vista赢得7非常不同。我运行的是64位Windows 7。运气不好,我甚至完全删除了大计时器生成。我想这可能与故事板生成有关。