DataRow не собирается GC - PullRequest
       20

DataRow не собирается GC

1 голос
/ 14 ноября 2011

В моем приложении проблема с утечкой памяти. это становится реальной проблемой при работе в течение долгих часов. У меня в основном есть следующий класс:

public class FeaturesDataSource{
     // Table used only for schema hosting
     DataTable selectedFeaturesDataTable;
     IDictionary<uint, MyFeatureType > _selectedFeaturesCache = 
          new Dictionary<uint, MyFeatureType>();
     // Create table according to a defined schema...

     // Adds or replaces an existing feature
     public void AddFeature(int featureID, MyFeatureType featureValue) {
           DataRow row = selectedFeaturesDataTable.NewRow();
           row["ID"] = featureID;
           row["Content"] = featureValue;
           if (_selectedFeaturesCache.ContainsKey(featureID) {
               _selectedFeaturesCache.Remove(featureID);
           }
           _selectedFeaturesCache.Add(featureID, row);
     }
}

Как видно из этого метода, вызов AddFeature создает новую строку данных в соответствии со схемой таблицы и заменяет любую существующую строку данных с таким же идентификатором. Мое приложение создает объекты типа MyFeatureType со скоростью 1 объект / секунду и каждый раз вызывает AddFeature с одинаковым идентификатором:

// This data source gets updated in the following way
public void MethodCalledEverySecond(MyFeatureType featureValue){
     // This data source contains only one object of type MyFeatureValue, 
     // replace the existing one by specifying a constant ID
     myFeatureDataSource.AddFeature(1, featureValue);  
}

это всегда должно заменить существующую строку данных новой. Во время выполнения VS показывает число словаря _selectedFeaturesCache, всегда равное 1, это ожидаемое значение, но !dumpHeap -stat показывает увеличивающееся количество объектов типа MyFeatureType в памяти, где оно всегда должно быть равно 1. Я что-то здесь не так делаю? Сохраняет ли selectedFeaturesDataTable.NewRow() ссылку на замену старых строк данных, блокируя их сбор GC?

1 Ответ

4 голосов
/ 14 ноября 2011

Согласно документации для метода NewRow здесь:

Когда вы используете NewRow для создания новых строк, строки должны быть добавлены или удалены из таблицы данных перед вызовом Clear

Что может означать, что существует ссылка на таблицу данных, из которой была создана строка.

Я думаю, вам нужно вызвать Delete, а затем AcceptChanges в строке, чтобы отсоединить его от таблицы.

...