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