Arhn - архитектура программирования

Динамический контроль утечки памяти

У меня есть приложение Windows Form. Когда я динамически добавляю некоторые кнопки в форму, а затем удаляю эти кнопки, возникает утечка памяти.

public partial class Form1 : Form
{
    private Button[] buttons = new Button[1000];

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 1000; i++)
        {
            var b = new Button();
            Controls.Add(b);
            buttons[i] = b;
        }

        for (int i = 0; i < 1000; i++)
        {
            Controls.Remove(buttons[i]);
            buttons[i].Dispose();
            buttons[i] = null;
        }
    }
}

Использование памяти:

  • После загрузки формы: 3720 КБ
  • После нажатия кнопки1: 5144 КБ

(Эти цифры записаны после полной сборки мусора. Программа запускалась без отладчика, релизная сборка.)

Что еще более странно, независимо от того, сколько раз выполняется button1_Click, использование памяти остается на уровне около 5100 КБ. Что я делаю неправильно?


  • Если памяти остается 5,1 мб, то утечки памяти нет. Утечка обычно означает, что она не останавливается в определенный момент. 13.07.2016
  • Но почему использование памяти увеличилось после добавления, а затем удаления элементов управления? Это довольно странно для меня. 13.07.2016
  • Вы можете попробовать позвонить GC.Collect(). Кроме того, попробуйте использовать профилировщик памяти, например Профилировщик памяти ANTS. 13.07.2016
  • Откуда вы берете данные об использовании? Приложение будет удерживать память, даже если оно в данный момент не используется, пока ОС не заберет ее обратно. 13.07.2016
  • Кроме того, если я только добавлю эти элементы управления, не удаляя их, он также использует 5,1 МБ памяти. Так что я думаю, что эти 1000 кнопок действительно используют 1,4 МБ памяти. 13.07.2016
  • О, это хороший момент. Я был просто диспетчером задач, чтобы получить цифры. 13.07.2016
  • Поскольку вы не упомянули, как вы измеряете использование памяти, я думаю, вы просто смотрите на Диспетчер задач. Для меня это совершенно нереалистичный (читай: наивный) подход. Отключение профилировщика памяти или, по крайней мере, некоторых счетчиков производительности должно быть правильным решением. 13.07.2016
  • Приложения не освобождают память в режиме реального времени. Это нормально для вашей операционной системы, если они сохранят дополнительную память для будущего использования. Мы говорим об утечках памяти, когда использование памяти приложениями со временем растет больше, чем необходимо, И они не могут освободить дополнительную память, когда операционная система запрашивает ее. Посмотрите на SQL Server, он со временем съест всю свободную память и будет уменьшаться только тогда, когда windows будет запрашивать свободную память для другого процесса. Это не означает, что вам нужно каждый день покупать новую оперативную память для вашего сервера... 13.07.2016
  • Спасибо всем за помощь. После использования надлежащего профилировщика памяти я могу подтвердить, что утечки памяти нет. Приведенный выше код работает по назначению. 13.07.2016

Ответы:


1

Это не утечка памяти. Прежде всего, если вы полагаетесь на диспетчер задач Windows, это неправильно. Если вы действительно хотите измерить фактическую память вашего приложения, попробуйте использовать некоторые счетчики производительности. Или, может быть, даже что-то вроде этого,

private Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;

Во-вторых, даже если объекты, выделенные в куче, собираются сборщиком мусора после их удаления, это не означает, что приложение освободит нераспределенную память. Это произойдет только в том случае, если операционная система запрашивает проводную память для других операций. Суть в том, что это не утечка памяти.

15.07.2016
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..