Dot-Net
表 NewRow() 導致記憶體洩漏
在調查記憶體洩漏時,我發現它是由在循環內多次呼叫 Table 上的 NewRow() 引起的。但是,創建的 DataRow 從未添加到 Table Rows 集合中,並且 Table Rows Count 從未超過零。
我的問題是為什麼每次呼叫 NewRow 時都會佔用更多記憶體,即使新創建的 DataRow 從未添加到 Rows 集合中,並且從 NewRow 返回的 DataRow 總是分配給相同的局部變數(從而顯然丟棄了最後一個新行)。
請忽略為什麼程式碼會創建未添加到表中的 DataRows 的問題!
DataRow 從 DataTable 繼承架構,因此存在從 DataRow 到生成行的表架構的引用。新行在表中處於分離狀態。
這就是為什麼 GC 不理會新的未使用行的原因。
DataTable.NewRow() 將創建的行添加到 DataTable 的 RecordManager。我不完全確定為什麼會發生這種情況,但這就是為什麼它沒有被 GC 釋放。
似乎只有兩種方法可以擺脫 DataRow:
- 將其添加到表中,然後將其刪除。
- 呼叫 DataTable.Clear()。