在寻找内存泄漏时,我发现了一件奇怪的事情,我不知道它是否正常。这是内存泄漏还是正常行为?
为了查找内存泄漏,我创建了一个小的测试应用程序与新的一个按钮和一个按钮检查这样做:
List<WeakReference> WeakReferences = new List<WeakReference>();
private void Button_New(object sender, RoutedEventArgs e)
{
WeakReferences.Add(new WeakReference(new ObjectUnderTest()));
// Adding a bunch of other objects to test here
}
private void Button_Check(object sender, RoutedEventArgs e)
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
int AliveCounter = 0;
foreach (var item in WeakReferences)
{
if (item.IsAlive)
{
AliveCounter++;
Debug.WriteLine("Object " + item.Target.GetType().ToString() + " still alive!");
}
}
if (AliveCounter > 0)
{
MessageBox.Show(AliveCounter.ToString() + " objects still alive!");
}
else
{
MessageBox.Show("No objects alive!");
}
}
我大部分的测试对象得到正确的垃圾收集在这种情况下,但有是一些仍然活着的物体。
经过更多测试后,我发现这些对象确实被垃圾回收,但只有在单击检查按钮之前切换到另一个应用程序。
你认为,这是正常的行为,还是这是一个内存泄漏,我必须解决?
附加信息: 目前我认为这确实是一个问题,但也许它不会在我们的生产代码中发生。
- 添加上新点击100个对象给出后约650 objetcs内存异常,所以GC不会收集,即使所需的内存用于其他目的。
- AddMemoryPressure不会使任何更确定性。
- 使用鼠标点击切换应用程序并无帮助,只有使用ALT + TAB进行切换才有用!
- 有时它有助于在我的测试应用程序中打开一个新窗口。
如果他们最终得到收集,它不能是一个“泄漏” - 这听起来更像是“我希望GC更积极” –
这只是一个测试应用程序,因为我们有很多泄漏,主要是因为忘记注销的事件。在这个测试应用程序中,如果GC更具侵略性,那会更好。但对于我们的真实应用程序,我只想知道我现在是否可以确定,如果需要,可以收集这些对象。我们不想告诉GC何时收集,我们只是想确保它们不会泄漏。 我们真正的应用程序将全天候运行,所以如果它泄漏将是一个问题。 – MTR