我的应用程序中有一个问题是泄漏了一些内存。这在长时间运行时成为一个真正的问题。 我基本上有以下课程:
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收集它们?
答案 0 :(得分:4)
根据NewRow方法的文档here:
使用NewRow创建新行时,必须先在数据表中添加或删除行,然后才能调用Clear
这似乎意味着从创建w行的位置引用了DataTable。
我认为您需要在行上调用Delete然后调用AcceptChanges将其从表中分离。