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

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收集它们?

最佳答案

根据有关NewRow方法here:的文档


  当您使用NewRow创建新行时,必须在调用Clear之前将这些行添加到数据表中或从数据表中删除。


这似乎意味着在创建w行的地方引用了DataTable。

我认为您需要先在行上调用Delete,然后再将其从表中分离出来。

关于c# - GC未收集DataRow,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8122941/

10-09 01:38