В моем приложении проблема с утечкой памяти. это становится реальной проблемой при работе в течение долгих часов.
У меня в основном есть следующий класс:
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?