почему мое wpf-распределение памяти постоянно увеличивается? - PullRequest
0 голосов
/ 19 мая 2019

Я недавно создал новое приложение WPF, имеющее цикл в MainWindow.xaml, который создает новый объект другой страницы (Test.xaml) и создает диалог страницы Test.xaml. В Test.xaml я добавил Textblock и обновил свойство Text для события Loaded и немедленно закрыл страницу.

Теперь, когда я запустил код, я увидел, что память, используемая этим приложением, постоянно увеличивается. Почему это действительно происходит?

Я уже избавляюсь от предыдущего объекта и переписываю с новым объектом, тем не менее он увеличивает память из-за предыдущего объекта.

В чем может быть причина этого? Как я могу удалить это поведение?

Я попытался создать дамп памяти приложения для анализа утечек памяти, там я увидел, что Hashtable, DependencyProperty и EventHandler используют большую часть памяти.

MainWindow.xaml

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        int counter = 0;
        Test test = null;

        do
        {
            test = null;
            test = new Test();

            test.ShowDialog();
        } while (++counter != 5000);

        test = null;
    }

Test.xaml

    private void Test_Loaded(object sender, RoutedEventArgs e)
    {
        MyTextBox.Text = "Testing leaks";
        Close();
    }

Я ожидаю, что объект должен быть полностью уничтожен и не должен способствовать увеличению памяти.

1 Ответ

2 голосов
/ 19 мая 2019

.NET использует сборщик мусора, который запускается время от времени.Когда вы устанавливаете объект на null, вы фактически удаляете только ссылку на объект, так что она может быть собрана во время следующей сборки мусора.Поскольку ваша программа не выполняет много выделений и не испытывает давления памяти, я не думаю, что сборщик мусора будет запущен.

Сброс переменной на null обычно не требуется, посколькуссылка также теряется, когда переменная выходит из области видимости.Возможно, вы захотите попробовать JetBrains DotMemory, и вы увидите, что приложение будет иметь относительную постоянную загрузку памяти после начальной загрузки.

Не вставляйте GC.Collect() в ваш код, потому что сборщик мусоракак правило, имеет хорошую эвристику, чтобы знать, когда ее нужно вызвать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...