2014-03-13 32 views
0

夥計們我在C#中有一個簡單的Windows窗體應用程序。它只有2個表格。一個表格只有一個按鈕,而另一個表格有一個DataGridView和一個按鈕。請看看這兩種形式的代碼:內存不是由DataGridView發佈的?

代碼Form1,有一個按鈕顯示Form2。的Form2

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void showFrom2_Click(object sender, EventArgs e) 
    { 
     Form2 frm2 = new Form2(); 
     frm2.Show(); 
    } 
} 

代碼,其具有被填充GUID在一次測試10K行的DataGridView

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void populateGrid_Click(object sender, EventArgs e) 
    { 
     DataTable dt = new DataTable(); 
     for (int i = 0; i < 10; i++) 
     { 
      dt.Columns.Add(i.ToString()); 
     } 
     for (int j = 0; j < 10000; j++) 
     { 
      DataRow row = dt.NewRow(); 
      for (int k = 0; k < 10; k++) 
      { 
       row[k] = Guid.NewGuid().ToString(); 
      } 
      dt.Rows.Add(row); 
     } 
     dataGridView1.DataSource = dt; 
    } 

    private void closeForm2_Click(object sender, EventArgs e) 
    { 
     dataGridView1.Dispose(); 
     this.Close(); 
    } 

現在,每當我填充DataGridView然後關閉Form2。內存不被釋放。如果我在不關閉整個應用程序的情況下繼續填充網格並關閉「多個」時間,則系統內存不足(我有1 GB RAM)。致電dataGridView1.Dispose();不應該GarbageCollector做他的工作,並釋放內存?

我想要的是,只要我關閉Form2,內存就應該在系統中釋放。

注意:我通過TaskManager來監視內存(我知道它沒有顯示正確的內存消耗量,但無論如何,因爲內存不足會導致內存不足。不被釋放)。我甚至試圖在關閉按鈕上撥打GC.Collect()(這不是一個好的電話,它也沒有幫助)。

此外,如果有人能告訴我如何監控應用程序的「真實」消費,我將不勝感激。我在某處閱讀過使用.Net性能計數器的地方。那是什麼?

P.S.不要問爲什麼我用10k行填充網格。我只是爲了測試目的而做它。

回答

1

不要打電話GC.Collect()有史以來。

一旦您的RAM限制即將被應用程序訪問,GC將被自動調用,但如果您的應用程序需要更多可供系統訪問的RAM,則會出現OutOfMemory異常。

+0

是的,我認爲內存限制是原因。 – NewbieProgrammer

-1

一旦調用dataGridView1.Dispose(); GarbageCollector不應該做他的工作,並釋放內存嗎?

不,一個與另一個無關。

  • Dispose用於非託管資源(非託管內存,文件句柄)。
  • GC在需要時運行,而不是在每次小處置時運行。

我甚至試圖調用GC.Collect()上的關閉按鈕(這是不是一個很好的通話,它 沒有幫助)。

這是一個愚蠢的電話,不是一個好的電話 - 它完全分解了GC統計數據,絕不應該在非常特定的問題和調試之外調用。

抓住內存分析器並找出原因。內存分析器將允許您查看哪些引用使對象保持活動狀態,以及事實上使用內存的內容。我敢打賭,這不是你的想法 - 而且錯誤不是你的想法,或者至少與你所展示的代碼無關。

保存記憶活着的形式中的罪魁禍首是遺漏引用和事件(因爲事件意味着調用者必須有一個指向被調用對象的指針)。

你顯示的代碼很好。

如果你是一個獲得memoryprofiler的問題 - 我更喜歡memprofiler(http://memprofiler.com/) - 沒有關聯,只是滿意的用戶。他們有7天的免費試用期。

+0

名稱調用不是教學的好工具。 – tylerjgarland