gpt4 book ai didi

c# - .NET 垃圾收集行为(使用 DataTable 对象)

转载 作者:行者123 更新时间:2023-11-30 13:24:23 25 4
gpt4 key购买 nike

我想知道为什么在创建一个非常简单的 DataTable 并将其设置为 null 后,垃圾收集器没有清除该 DataTable 使用的所有内存。这是一个例子。变量 Before 应该等于 Removed 但它不是。

{
long Before = 0, After = 0, Removed = 0, Collected = 0;

Before = GC.GetTotalMemory(true);
DataTable dt = GetSomeDataTableFromSql();
After = GC.GetTotalMemory(true);
dt = null;
Removed = GC.GetTotalMemory(true);
GC.Collect();
Collected = GC.GetTotalMemory(true);
}

给出以下结果。

Before = 388116
After = 731248
Removed = 530176
Collected = 530176

最佳答案

几个原因:

GC 在它自己的最佳时间运行;通常在运行时内存不足时。这就是为什么处理像数据库连接这样的对象很重要的原因;是的,它们最终会被释放,但直到 GC 屈尊运行。

GC.Collect() 不直接运行 GC 线程;它安排了一次 GC 运行。同样,运行时通常仅在注意到沙箱变得困惑或有大量空闲时间时才运行 GC。 GC.Collect() 是一种覆盖,其行为与这些自动触发器之一发生时的行为相同。它不是运行垃圾收集算法的内联调用;这会导致性能明显下降。

GC 在它自己的线程中运行。因此,GC 静态方法提供的信息基于调用者在调用时可用的信息。您是在 GC 仍在工作时最后一次调用 GetTotalMemory,或者可能在它开始之前最后一次调用,因此内存数据尚未更新为 GC 正在完成的内容。

总而言之,GC 的设计目的是在很大程度上不干涉。 GC.Collect() 相当于在你的酒店门上挂了“请服务”的牌子;这是一个建议,也许现在是清理的好时机。

关于c# - .NET 垃圾收集行为(使用 DataTable 对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4673237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com