При поиске утечек памяти я обнаружил странную вещь, которую я не знаю, нормально это или нет.
Чтобы обнаружить утечки памяти, я создал небольшое тестовое приложение с кнопкой new и проверкой кнопки, выполнив это:
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 объектов, поэтому сборщик мусора не собирается, даже если память нужна для других целей.
- AddMemoryPressure не делает ничего более детерминированным.
- Переключение приложения щелчком мыши не помогает, помогает только переключение с помощью ALT + TAB!?!
- Также иногда помогает открыть новое окно в моем тестовом приложении.