在搜索泄漏时没有成功
再努力一点 =)
在托管语言中,内存泄漏可能很难追踪。我在Redgate ANTS内存分析器方面有良好的经验。它不是免费的,但他们提供了一个14天的完整功能试用期。它具有良好的用户界面,并向您显示内存分配位置,以及为什么这些对象保存在内存中。
正如Alex所说,事件处理程序是.NET应用程序中非常常见的内存泄漏来源。请考虑以下内容:
public static class SomeStaticClass
{
public event EventHandler SomeEvent;
}
private class Foo
{
public Foo()
{
SomeStaticClass.SomeEvent += MyHandler;
}
private void MyHandler( object sender, EventArgs ) { }
}
我在这里使用了一个静态类,以使问题尽可能明显。假设在应用程序的生命周期内创建了许多Foo
对象。每个Foo
都订阅了静态类的SomeEvent
事件。
Foo
对象可能会在某个时候超出范围,但静态类通过事件处理程序委托保持对每个对象的引用。因此,它们将无限期地保持活动状态。在这种情况下,事件处理程序只需要“取消挂钩”。
...XNA项目似乎保存了我确实在使用的许多字节数组...
您可能会遇到LOH中的碎片化问题。如果您经常分配大型对象,则可能会导致此问题。这些对象的总大小可能比分配给运行时的总内存小得多,但由于碎片化,有很多未使用的内存分配给您的应用程序。
我上面提供的分析工具将告诉您是否存在此问题。如果是,则可能会追踪到某个对象泄漏。我刚刚解决了我的应用程序中显示相同行为的问题,原因是MemoryStream
即使在调用Dispose()
后也没有释放其内部的byte[]
。将流包装在虚拟流中并将其设置为null即可解决问题。
此外,显而易见的是,请确保Dispose()
实现了IDisposable
接口的对象。可能会有未释放的本机资源。同样,一个好的分析工具可以捕获到这个问题。
我的建议是:问题不在于垃圾回收,而是在于你的应用程序。使用分析器,使你的应用程序处于高内存消耗状态,拍摄内存快照并开始分析。