gpt4 book ai didi

c# - 什么时候可以调用 GC.Collect?

转载 作者:IT王子 更新时间:2023-10-29 03:31:11 28 4
gpt4 key购买 nike

一般的建议是您不应从您的代码中调用 GC.Collect,但这条规则有哪些异常(exception)情况?

我只能想到一些非常具体的情况,在这些情况下强制进行垃圾收集可能是有意义的。

我想到的一个例子是服务,它每隔一段时间醒来,执行一些任务,然后长时间休眠。在这种情况下,强制收集以防止即将空闲的进程占用比需要更多的内存可能是个好主意。

是否还有其他情况可以调用GC.Collect

最佳答案

如果您有充分的理由相信一组重要的对象——尤其是那些您怀疑在第 1 代和第 2 代中的对象——现在有资格进行垃圾收集,并且现在是收集垃圾的合适时机性能影响小。

一个很好的例子是,如果您刚刚关闭了一个大表单。您知道现在可以对所有 UI 控件进行垃圾回收,并且用户可能不会注意到表单关闭时的短暂停顿。

更新 2.7.2018

从 .NET 4.5 开始 - 有 GCLatencyMode.LowLatencyGCLatencyMode.SustainedLowLatency。进入和离开这些模式中的任何一种时,建议您使用 GC.Collect(2, GCCollectionMode.Forced) 强制执行完整 GC。

从 .NET 4.6 开始 - 有 GC.TryStartNoGCRegion 方法(用于设置只读值 GCLatencyMode.NoGCRegion)。这本身可以执行完全阻塞垃圾收集以尝试释放足够的内存,但鉴于我们在一段时间内不允许 GC,我认为在前后执行完全 GC 也是一个好主意。

资料来源:Microsoft 工程师 Ben Watson 的:编写高性能 .NET 代码,第 2 版。 2018.

参见:

关于c# - 什么时候可以调用 GC.Collect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/478167/

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