【发布时间】:2010-06-11 12:45:38
【问题描述】:
我有以下代码
DataView dvTest= dsTest.Tables[1].Copy().DefaultView;
(巨大的)数据集 dsTest 的副本是否会保留在内存中,或者默认情况下会被垃圾收集?
它是否将整个数据集复制到内存中? GC什么时候发生?
【问题讨论】:
标签: c# memory-management garbage-collection
我有以下代码
DataView dvTest= dsTest.Tables[1].Copy().DefaultView;
(巨大的)数据集 dsTest 的副本是否会保留在内存中,或者默认情况下会被垃圾收集?
它是否将整个数据集复制到内存中? GC什么时候发生?
【问题讨论】:
标签: c# memory-management garbage-collection
这实际上可能是两个问题:1) 匿名对象生命周期,以及 2) 数据集生命周期。
for 1) - 只要没有对对象的引用,它就有资格被垃圾回收,就像“命名”对象一样。
for 2) 数据表的默认视图具有对表的引用,因此数据表将保留在内存中,直到您不再持有对视图的引用(或任何行等 - 任何引用数据集的内容)。
【讨论】:
它很可能会挂起,因为DefaultView 引用的对象本身持有对从Copy 返回的对象的引用。当然,一旦它变得无法访问,它最终会被收集起来。但是,至少,你的dvTest 会导致它持续一段时间。
【讨论】:
您正在复制 DataTable,然后通过 DefaultView 在 dvTest 中保存对它的引用,因此在 dvTest 超出范围之前不会对其进行垃圾收集。
【讨论】: