Dot-Net

表 NewRow() 導致記憶體洩漏

  • July 12, 2018

在調查記憶體洩漏時,我發現它是由在循環內多次呼叫 Table 上的 NewRow() 引起的。但是,創建的 DataRow 從未添加到 Table Rows 集合中,並且 Table Rows Count 從未超過零。

我的問題是為什麼每次呼叫 NewRow 時都會佔用更多記憶體,即使新創建的 DataRow 從未添加到 Rows 集合中,並且從 NewRow 返回的 DataRow 總是分配給相同的局部變數(從而顯然丟棄了最後一個新行)。

請忽略為什麼程式碼會創建未添加到表中的 DataRows 的問題!

DataRow 從 DataTable 繼承架構,因此存在從 DataRow 到生成行的表架構的引用。新行在表中處於分離狀態。

這就是為什麼 GC 不理會新的未使用行的原因。

DataTable.NewRow() 將創建的行添加到 DataTable 的 RecordManager。我不完全確定為什麼會發生這種情況,但這就是為什麼它沒有被 GC 釋放。

似乎只有兩種方法可以擺脫 DataRow:

  1. 將其添加到表中,然後將其刪除。
  2. 呼叫 DataTable.Clear()。

引用自:https://stackoverflow.com/questions/242629