动态网站制作指南
[  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 软件工程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ 软件工程 ]的信息

本月文章推荐
.嵌入式软件测试的十大秘诀.
.Spring破冰之旅 始于足下.
..NET架构与模式探索.
.免费午餐已经结束——软件向并发.
.如何对软件质量进行评估(1).
.2007年值得去思考的N大软件技术.
.动态连接库(DLL).
.UML建模风格之状态图.
.绘制UML活动图的步骤和要点.
.浅析软件项目管理中的10个误区.
.软件架构训练之层次及使用.
.使用模式集成UML视图.
.需求工程 研究现状.
.语音识别系统中增加图像识别技术.
.需求调研分析中的项目干系人概念.
.壮士断臂 Borland为生存将出售开.
.对软件项目管理的探讨.
.游戏引擎剖析(十).
..NET 2.0里使用强类型数据创建多.
.出航SOA—中远集运全球EDI平台建.

浅谈CLR的内存分配和回收机制

文章类别:软件工程 | 发表日期:2008-3-23 |



  相对于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();
 }
}
  * 析构函数会在编译时会被翻译为protected void Finalize(),这是C#的析构函数的语法

  GC在回收对象之前会调用Finalize()来实现非托管资源的释放,不过按照MSDN的说法,Finalize()会导致性能的降低。

  “垃圾回收器使用名为“终止队列”的内部结构跟踪具有 Finalize 方法的对象。每次您的应用程序创建具有 Finalize 方法的对象时,垃圾回收器都在终止队列中放置一个指向该对象的项。托管堆中所有需要在垃圾回收器回收其内存之前调用它们的终止代码的对象都在终止队列中含有项。

  实现 Finalize 方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们。用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收。当垃圾回收器执行回收时,它只回收没有终结器的不可访问对象的内存。这时,它不能回收具有终结器的不可访问对象。它改为将这些对象的项从终止队列中移除并将它们放置在标为预备终止的对象列表中。该列表中的项指向托管堆中预备被调用其终止代码的对象。垃圾回收器为此列表中的对象调用 Finalize 方法,然后,将这些项从列表中移除。后来的垃圾回收将确定终止的对象确实是垃圾,因为标为预备终止对象的列表中的项不再指向它们。在后来的垃圾回收中,实际上回收了对象的内存。” --[MSDN]

  更加建议实现Sytem.IDisposable.Dispose()接口,用来实现对非托管资源的释放,这也是.Net Framework中常见的设计模式。那该怎么实现Dispose呢?

  1、首先,Dispose接口应该释放自身对象所占用的资源,还应该调用基类的Dispose方法,释放基类部分所占用的资源。

public void Dispose()
{
 // do something to release my unmanaged resource
 ReleaseMyResource();

 base.Dispose();
}
  2、前面说过Finalize()会导致性能问题,那么在执行Dispose以后就应该告诉GC不用在调用Finalize()了

public void Dispose()
{
 // do something to release my unmanaged resource
 ReleaseMyResource();
 base.Dispose();

 // tell gc not to call Finalize()
 GC.SuppressFinalize(this);
}
  当然我们完全可以定义一个MySpace.IClosable.Close(),通过实现这个接口来进行非托管资源的释放,不过这实在没有必要。

上一篇:软件项目需求分析困难的原因 人气:104
下一篇:用预测性对象点度量面向对象软件 人气:102
点击此处浏览全部软件工程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-5-16 乘风多用户PHP统计系统 v3.4
2008-5-16 轩溪下载系统 v3.78 build 0515
2008-5-16 普沙B2B 浙江省商贸网 v2.0
2008-5-16 asp抓蜘蛛的小程序 v1.0
2008-5-16 齐齐乐网私服发布站 仿haosf新版
2008-5-16 IssTech信息反馈系统 v1.0
2008-5-16 自由领域大头贴(js接口版) 修正版
2008-5-16 医院网站系统
2008-5-16 智拓-分类信息管理系统 v5.0
2008-5-7 Windows XP SP3 官方英文版
2008-5-7 Windows XP SP3 官方香港中文版
2008-5-7 Windows XP SP3 官方繁体中文版
2008-5-7 Windows XP SP3 官方简体中文版
2008-4-30 Multiple Unzip Wizard 1.02
2008-4-30 Multiple Unrar Wizard 1.0.0
2008-4-30 WinZip Install/Try/Uninstall a
2008-4-30 ZIP压缩文件修复器WzipFix 2.0
2008-4-30 Pentazip 6.01 Build 189 For Wi
  发表评论
姓 名: 验证码: [ 全部贴吧 ] [ 浏览评论 ]
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報