C# C中本地方法之后的垃圾收集#
我是C#的初学者,只是一个关于C#中垃圾收集的问题。假设我们有以下代码:C# C中本地方法之后的垃圾收集#,c#,.net,C#,.net,我是C#的初学者,只是一个关于C#中垃圾收集的问题。假设我们有以下代码: ... public void Test() { ... MyClass a = new Myclass() } 那么什么时候CLR会收集垃圾呢?我的意思是在Test()方法执行后立即收集垃圾?或者当程序完成时?运行此代码不会让您控制或知道垃圾收集何时运行,有许多条件会触发垃圾收集: 垃圾收集的条件 系统的物理内存不足。这是由低电平或低电平检测到的 来自操作系统的内存通知或主机指示的内存不足 托管堆上已分
...
public void Test()
{
...
MyClass a = new Myclass()
}
那么什么时候CLR会收集垃圾呢?我的意思是在Test()方法执行后立即收集垃圾?或者当程序完成时?运行此代码不会让您控制或知道垃圾收集何时运行,有许多条件会触发垃圾收集: 垃圾收集的条件
- 系统的物理内存不足。这是由低电平或低电平检测到的 来自操作系统的内存通知或主机指示的内存不足
- 托管堆上已分配对象使用的内存 超过可接受的阈值。该阈值是连续的 在流程运行时进行调整
- 调用GC.Collect方法。几乎在所有情况下,您都没有 调用此方法,因为垃圾收集器连续运行。 此方法主要用于特殊情况和测试
- 当虚拟内存空间不足时
- 当分配的内存被抑制时,可接受阈值(当GC发现生存率(活体)较高时,则会增加阈值分配)
- 当我们显式调用GC.Collect()方法时,由于GC连续运行,实际上不需要调用此方法
GC.Collect()
如果您对释放非托管资源(文件、连接、基本上不受CLR控制的所有内容)感兴趣,您应该研究dispose模式。通常您会实现
IDisposable
接口。但是有很多很好的方法可以做到这一点,即使Dispose()
没有被代码调用,也可以释放非托管资源。看一看 当垃圾收集器觉得有必要时,立即使用GC使用托管语言的全部目的就是能够假装您使用的是无限的地址空间,而不必担心实际内存/地址空间何时/如何使用和释放。回答得很好!