未被GC收集的数据

本文关键字:数据 GC 未被 | 更新日期: 2023-09-27 18:14:24

我的应用程序存在内存泄漏问题。当长时间跑步时,这成为一个真正的问题。我基本上有以下类:

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

未被GC收集的数据

根据这里的NewRow方法的文档:

当使用NewRow创建新行时,必须在调用Clear

之前将这些行添加到数据表或从数据表中删除。

这似乎暗示有一个对数据表的引用,从那里创建了行。

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