gpt4 book ai didi

c# - 为什么我的 .NET 垃圾没有被收集?

转载 作者:太空宇宙 更新时间:2023-11-03 15:44:16 25 4
gpt4 key购买 nike

我有一个数据密集型应用程序,用户可以在其中选择不同的帐户。一次只能选择一个帐户,这会强制从数据库中加载数据。当我将帐户加载到大约半个演出时,我可以在 Windows 任务管理器中看到分配给我的应用程序的内存正在增加。

我们还可以“卸载”一个帐户,从而删除内存中的所有对象(或者至少我们认为我们这样做)。无论我让应用程序在我的 PC 上处于休眠状态运行多长时间,它似乎永远不会将分配的内存减少回预加载帐户状态,即使我使用 WeakReference 查看对象状态时说它不是 ALIVE。

如果我在卸载方法的末尾显式调用 GC.Collect(),那么我可以看到未分配的内存或至少 Windows 任务管理器中程序的大小正在下降。这是我们真正希望在内存方面实现的,因为一些用户遇到了内存不足的异常情况。

我知道垃圾收集器正在做一些管理,因为如果我加载后续帐户,内存不会真正增加超过半个演出,所以我认为 GC 已经收集了以前帐户的数据,就像卸载帐户时应该做的那样。

我是否应该继续使用 GC.Collect,考虑到运行它相对于从数据库加载帐户的成本是最小的,即使显式调用它被认为是“不好的做法”?

最佳答案

根据您的描述,您似乎以某种方式保留了从数据库加载的项目的硬引用。如果您使用的是 Entity Framework 或 NHibernate,请检查您是否正在处理用于从数据库加载数据的上下文,因为它将保存您加载的所有内容的引用,以提供更改跟踪功能。通常要确保您没有以某种方式保留引用,并注意有时这可能很棘手;棘手的硬引用的一个很好的例子是在使用方法范围变量的 lamda 方法中加载一些东西,由于在 lamda 方法内部被引用,它会自动提升为类变量。

关于c# - 为什么我的 .NET 垃圾没有被收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28898317/

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