C# C中本地方法之后的垃圾收集#

C# C中本地方法之后的垃圾收集#,c#,.net,C#,.net,我是C#的初学者,只是一个关于C#中垃圾收集的问题。假设我们有以下代码: ... public void Test() { ... MyClass a = new Myclass() } 那么什么时候CLR会收集垃圾呢?我的意思是在Test()方法执行后立即收集垃圾?或者当程序完成时?运行此代码不会让您控制或知道垃圾收集何时运行,有许多条件会触发垃圾收集: 垃圾收集的条件 系统的物理内存不足。这是由低电平或低电平检测到的 来自操作系统的内存通知或主机指示的内存不足 托管堆上已分

我是C#的初学者,只是一个关于C#中垃圾收集的问题。假设我们有以下代码:

...
public void Test()
{
   ...
   MyClass a = new Myclass()
}

那么什么时候CLR会收集垃圾呢?我的意思是在Test()方法执行后立即收集垃圾?或者当程序完成时?

运行此代码不会让您控制或知道垃圾收集何时运行,有许多条件会触发垃圾收集:

垃圾收集的条件

  • 系统的物理内存不足。这是由低电平或低电平检测到的 来自操作系统的内存通知或主机指示的内存不足

  • 托管堆上已分配对象使用的内存 超过可接受的阈值。该阈值是连续的 在流程运行时进行调整

  • 调用GC.Collect方法。几乎在所有情况下,您都没有 调用此方法,因为垃圾收集器连续运行。 此方法主要用于特殊情况和测试

更多信息:

回答者:

GC何时被触发? 没有触发GC的特定计时,GC会在以下条件下自动启动操作:

  • 当虚拟内存空间不足时
  • 当分配的内存被抑制时,可接受阈值(当GC发现生存率(活体)较高时,则会增加阈值分配)
  • 当我们显式调用GC.Collect()方法时,由于GC连续运行,实际上不需要调用此方法

与其他语言不同,c#自行为您清理大部分资源。正如您在其他答案中所读到的,当GC检测到不再需要资源并且他有时间这样做时,资源被释放。但是,如果确实需要手动触发,可以使用
GC.Collect()


如果您对释放非托管资源(文件、连接、基本上不受CLR控制的所有内容)感兴趣,您应该研究dispose模式。通常您会实现
IDisposable
接口。但是有很多很好的方法可以做到这一点,即使
Dispose()
没有被代码调用,也可以释放非托管资源。看一看

当垃圾收集器觉得有必要时,立即使用GC使用托管语言的全部目的就是能够假装您使用的是无限的地址空间,而不必担心实际内存/地址空间何时/如何使用和释放。回答得很好!