2011-11-14 68 views
1

我在我的應用程序中泄漏了一些內存。這在長時間運行時成爲一個真正的問題。 我主要有以下幾個等級: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收集它們?

+0

爲什麼它不應該有很多MyFeatureType對象?您可能在調用AddFeature之前創建它們。 – Strelok

+0

是的,我確實創建了它們來替換現有的,這是客戶端要求:) – GETah

+1

您是否檢查過對象是否已生根,以及如果是這樣? !gcroot {id} – PHeiberg

回答

4

根據對NEWROW方法的文檔here:

當您使用NEWROW創建新行,該行必須添加或刪除從數據表中打電話之前清除

這似乎暗示有一個從創建行的引用DataTable。

我認爲您需要調用Delete,然後在該行上接受ChangeChanges以將其從表中分離。

+0

謝謝你,我明天會試一試,並會讓你發佈:) – GETah

+0

它的工作!非常感謝你的幫助! – GETah