我在我的應用程序中泄漏了一些內存。這在長時間運行時成爲一個真正的問題。 我主要有以下幾個等級:DataRow不是由GC收集的
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
類型的對象,並調用AddFeature
具有相同ID每次:
// 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收集它們?
爲什麼它不應該有很多MyFeatureType對象?您可能在調用AddFeature之前創建它們。 – Strelok
是的,我確實創建了它們來替換現有的,這是客戶端要求:) – GETah
您是否檢查過對象是否已生根,以及如果是這樣? !gcroot {id} – PHeiberg