积木首页 | 500多种网页特效 | 函数手册 | 广播电台 | 高清晰图片素材 | 服务器合租 | 万年历 | 网友最新浏览记录
程序开发 网页设计 搜索引擎 特效代码 操作系统 防范病毒 黑客技术 图形图象 电脑硬件 网络技术 服 务 器 数 据 库 网文精粹
您的位置:积木首页 >> 黑客技术频道 >> 黑客编程 >> 正文:
标题:浅谈CLR的内存分配和回收机制
时间:2006-3-4 来源:不详 浏览数:
 相对于C++程序员来说,C#程序员是非常幸运的,至少我们不需要为内存泄漏(Memory Leak)而头疼,不需要负责内存的分配和回收。但这不意味着我们只需要知道new的语法就可以了,作为一个严肃的C#程序员,我们应该对此有所了解,有助于我们编写性能更好的代码。

  一、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 string("foo"));
 }
 // 输出填充后所占的内存大小
 Console.WriteLine("used memory:" + GC.GetTotalMemory(false));
}

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

  二、CLR的内存回收机制

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

using System;
using System.IO;

public class Foo
{
 private FileStream _stream;

 public Foo()
 {
  _stream = new FileStream(@"c:\foo.txt", FileMode.Open);
 }

 // some other operation here...
 
 ~Foo()
 {
  // release the unmanaged resource
  _stream.Close();
 }
}

(责任编辑:欣欣裴)
关于本站 | 广告服务 | 联系我们 | 版权申明 | 强强联盟 | 投稿热线 | 网站地图 | 申请链接
Copyright ©2005-2006 Gimoo.net All rights reserved. 积木网 版权所有
E-mail:gimoohr@gmail.com 京ICP备05050695号