未被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收集它们?
根据这里的NewRow方法的文档:
当使用NewRow创建新行时,必须在调用Clear
之前将这些行添加到数据表或从数据表中删除。
这似乎暗示有一个对数据表的引用,从那里创建了行。
我认为你需要调用Delete,然后在行上调用AcceptChanges以将其从表中分离。