GC没有收集DataRow

时间:2011-11-14 14:21:20

标签: c# .net garbage-collection datatable

我的应用程序中有一个问题是泄漏了一些内存。这在长时间运行时成为一个真正的问题。 我基本上有以下课程:

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会根据表的架构创建一个新的数据行,并替换具有相同ID的任何现有数据行。 我的应用程序以1个对象/秒的速率创建MyFeatureType类型的对象,并且每次都使用相同的ID调用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 个答案:

答案 0 :(得分:4)

根据NewRow方法的文档here:

  

使用NewRow创建新行时,必须先在数据表中添加或删除行,然后才能调用Clear

这似乎意味着从创建w行的位置引用了DataTable。

我认为您需要在行上调用Delete然后调用AcceptChanges将其从表中分离。