Welcome

首页 / 软件开发 / C# / 浅谈CLR的内存分配和回收机制

浅谈CLR的内存分配和回收机制2011-04-06 cnblogs chwkai Aero相对于C++程序员来说,C#程序员是非常幸运的,至少我们不需要为内存泄漏(Memory Leak)而头疼,不需要负责内存的分配和回收。但这不意味着我们只需要知道new的语法 就可以了,作为一个严肃的C#程序员,我们应该对此有所了解,有助于我们编写性能更好 的代码。

主要内容:

CLR的内存分配机制

CLR的回收机制

一、CLR的内存分配机制

.NET Framework 的垃圾回收器管理应用程序的内存分配和释放。每次使用 new 运算 符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运 行库就会继续为新对象分配空间。

...
object obj = new object();
...

但是,内存不是无限大的。

public void FillMemory()
{
ArrayList memory = new ArrayList();

// 输出填充前所占内存大小
Console.WriteLine("used memory:" + GC.GetTotalMemory(false));
for (int i = 0; i < 100000; i++)
{
memory.Add(new object());
}
// 输出填充后所占的内存大小
Console.WriteLine("used memory:" + GC.GetTotalMemory(false));
}

最终,垃圾回收器必须执行回收以释放一些内存。垃圾回收器优化引擎根据正在进行 的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被 应用程序使用的对象并执行必要的操作来回收它们占用的内存。

二、CLR的内存回收机制

一般我们在程序中创建的对象大部分都是托管对象,可依靠GC自动进行内存的回收, 但是对于封装了非托管资源的对象,就需要我们显式重载object.Finalize()接口来实现 非托管资源的释放。

using System;
using System.IO;
public class Foo
{
private SomeComObject _com;
public Foo()
{
_com = new SomeComObject();
}
// some other operation here...
~Foo()
{
// release the unmanaged resource
_com.Close();
}
}