具有IDisposable且没有IDisposable的内存释放

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

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

我试图实现IDisposable,然后ram不断下降。

为什么是这样? 我不做GC.Collect我只是释放对象并告诉GC他不需要为我的对象调用终结器?

更新

这是我在IDIsposable对象中使用的代码:

public void Dispose() { base.Dispose(); Dispoe(true); GC.SuppressFinalize(); } private void Dispoe(bool disposing) { //here i release unmanaged resources if (disposing) { //here i release all managed resources } } ~MyObject() { Dispose(false); } 

在我的大对象中,我做了myObject.Dispose(); 在我不再需要他之后。

我的问题不是关于如何实现IDisposable,而是关于GC代的工作。

我只是想知道如何可能的情况之间的公羊大小差异的情况我做Dispoe我的对象情况我不会Dispoe我的对象。

正如@Steven在他的评论中指出的那样,IDisposable是CLR不关心的东西。 通过实现它,您只需告诉消费者您的对象在不再需要对象时调用其Dispose方法。 在内存管理方面,您可以为此构建自己的界面,比如IDisposable2,并获得相同的技术效果。 然而,这将是一件愚蠢的事情,因为.net开发人员应该知道在不再需要对象时调用idisposable.dispose。 此外,还有对此接口的内置语言(c#)支持(使用{…})。

你写道“我试图实施IDisposable,然后ram不断下降。”

重要的是你的“工具”做了什么。 那里的代码应该清理非托管代码,Windows资源等。

使用.NET内存没有像往常一样的2个状态(使用和未使用),但实际上是4:(A)由活动对象使用,(B)由死对象使用,(C)不被任何对象使用,而是由框架和(D)未使用。

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

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

你想要实现的是,在你的大对象超出范围之后,尽可能快地将它所使用的内存转到(D)。 以下是一些提示:

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

  • 在对象处理周围尝试使用AddMemoryPressure()括号,但要注意副作用。 这类似于强制GC.Collect() ,但侵扰性较小:它会暗示GC 很快收集,但现在不完全收集

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

使用IDisposable意味着您正在实现Dispose方法,您可以将所有清理代码放在不再需要的资源上。 它不会将您的对象移除到托管堆,GC仍然是负责释放内存的人。

当您实现IDisposable并处置该对象时,您将该对象标记为可用于垃圾回收。

您无法准确预测何时会收集它。