Вопрос

Во время исследования утечки памяти я обнаружил, что она была вызвана многократным вызовом NewRow () для Table внутри цикла. Однако созданный DataRow никогда не добавлялся в коллекцию Table Rows, и количество строк в таблице никогда не превышало ноль.

Мой вопрос: почему при каждом вызове NewRow используется больше памяти, хотя вновь созданный DataRow никогда не добавляется в коллекцию Rows, а DataRow, возвращаемый из NewRow, всегда присваивается одной и той же локальной переменной (таким образом, очевидно, отбрасывая последний новый ряд).

Пожалуйста, не обращайте внимания на то, почему код создает строки данных, которые не добавляются в таблицу!

Это было полезно?

Решение

DataRow наследует схему от DataTable, поэтому есть ссылки из DataRow на схему таблицы, которая сгенерировала строку. Новая строка находится в отдельном состоянии в таблице.
Вот почему GC оставил новые неиспользованные строки в покое.

Другие советы

DataTable.NewRow () добавляет созданную строку в RecordManager в DataTable. Я не совсем уверен, почему это происходит, но именно поэтому он не освобожден GC.

Похоже, что существует только два способа избавиться от DataRow:

<Ол>
  • Добавьте его в таблицу, затем удалите.
  • Вызовите DataTable.Clear ().
  • Я думаю, что ваши две проблемы связаны.

    Table.NewRow создает новую строку данных, которая имеет тот же формат столбца, что и исходная таблица.

    Эту новую строку необходимо добавить в таблицу с помощью table.Rows.Add (newRow). Ваш цикл будет создавать объекты, которые никогда не используются, и, следовательно, будет поглощать память. Смотрите эту статью для получения дополнительной информации http://msdn.microsoft.com/en- нас / библиотека / system.data.datatable.newrow.aspx

    Если вы создадите newRow = table.NewRow () и затем в приведенном ниже коде определитесь, чем этот newRow вам больше не нужен. 1) Добавьте строку if в таблицу. 2) Удалите, это предотвратит утечку памяти.

        var table = new DataTable();
        while (true)
        {
            var newRow = table.NewRow();
            table.Rows.Add(newRow);   //Without this 2 rows you will have memory leak.
            table.Rows.Remove(newRow);//
        }
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top