gpt4 book ai didi

c# - 使用 IDisposable 和不使用 IDisposable 的内存释放

转载 作者:行者123 更新时间:2023-11-30 18:47:00 25 4
gpt4 key购买 nike

在我的应用程序中,我有一个每隔几秒创建一次的大对象。我用它做了一些工作,然后就不再需要它了。

我在任务管理器中看到,即使我没有对该对象的任何引用并且需要收集它,ram 大小也会增加。

在实现 IDisposable 后,ram 立即关闭。

这是为什么?我没有执行 GC.Collect,我只是释放了对象并告诉 GC 它不需要为我的对象调用终结器。

编辑:

这是我用于我的 IDisposable 对象的代码:

public void Dispose()
{
base.Dispose();
Dispose(true);
GC.SuppressFinalize();
}

private void Dispose(bool disposing)
{
//here i release unmanaged resources
if (disposing)
{
//here i release all managed resources
}
}

~MyObject()
{
Dispose(false);
}

在我的大对象中,我在不再需要它之后执行 myObject.Dispose();

我的问题不是关于如何实现 IDisposable 或 GC 的一般工作方式。我只想知道当我自己处理对象或让 GC 完成它的工作时会有什么不同。

最佳答案

.NET 内存不像往常一样有 2 种状态(已使用和未使用),但实际上有 4 种:(A) 由事件对象使用,(B) 由死对象使用,(C) 未被任何对象使用, 但框架和 (D) 未使用。

当你创建一个对象时,Framework 会首先尝试为它使用类别 (C) 的内存,如果它没有足够的剩余可用空间,它会向操作系统询问一些类型 (D),将将其转换为 (C),然后将其用于您的对象。

当一个对象超出范围时,它将从 (A) 落到 (B),在下一次垃圾运行时它将从 (B) 落到 (C) 或 (D)。这在很大程度上取决于内部结构(想想内存碎片和 friend )、内存压力和收集的对象类型(想想 IDisposable 和 friend )

您想要实现的是,在您的大对象超出范围后,尽快将其使用的内存转到 (D)。这里有一些提示:

  • 确保您的对象的大小是 4K 的倍数 - 这样更有可能没有其他对象与您的对象共享内存页,因此它可以更容易地返回给操作系统

  • 围绕对象处理使用 AddMemoryPressure() 括号进行试验,但要注意副作用。这类似于强制 GC.Collect(),但侵入性较小:它将提示 GC 很快收集,但不是现在/p>

  • 重新思考您的基本概念:大对象是单例(即在任何给定时间只能存在一个)吗?如果是,请考虑分配一次并回收它:这将使您的应用程序 RAM 需求更可预测 - 并可能使您在运行时避免出现丑陋的 OOM 情况。

关于c# - 使用 IDisposable 和不使用 IDisposable 的内存释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11359131/

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