C#之垃圾回收
垃圾回收时现代语言的标志之一。垃圾回收解放了手工管理对象释放的工作,提高了程序的健壮性,但是副作用就是程序代码可以对于创建对象变得随意。
1、避免不必要的对象创建
由于垃圾回收的代价较高,所以C#程序开发要遵循的一个基本原则就是避免不必要的对象创建。以下列举一些常见的情型。
a)、避免循环创建对象
如果对象并不会随每次循环改变而改变状态,那么在循环中反复创建对象将带来性能损耗。例如下面的例子:
SqlBuildResults BuildUpdate(IEntityMap Map,IObjectValue date)
{
SqlBuildResults results = new SqlBuildResults();
foreach(IORMap ormap in map.Maps)
{
UpdateBuilder builder = new UpdateBuilder();
SqlBuildResults result = builder.BuildUpdate(ormap,date);
if(result != null)
results.AddRange(result);
}
return results;
}
高效的做法是将builder对象提到循环外面创建。
b)、在需要的逻辑分支中创建对象
如果对象只在默写逻辑分支中才被用到,那么应该只在该逻辑分支中创建对象。例如:
protected virtual object OnGetRelation(string childAttrName, IAssociaton association, object relation)
{
ObjectRelationEventArgs args1 = new ObjectRelationEventArgs(association, relation, relation);
if (this.GetRelation != null)
{
this.GetRelation(childAttrName, this.Anchor, args1);
relation = args1.NewRelation;
}
return relation;
}
正确的做法是:
protected virtual object OnGetRelation(string childAttrName, IAssociaton association, object relation)
{
if (this.GetRelation != null)
{
ObjectRelationEventArgs args1 = new ObjectRelationEventArgs(association, relation, relation);
this.GetRelation(childAttrName, this.Anchor, args1);
relation = args1.NewRelation;
}
return relation;
}
c)、使用常量避免创建对象
如下例,程序中存在大量new decimal(0)的代码,这会导致小对象频繁创建及回收;
if (convert1.FromDualQty.RateToBase == new decimal(0))
{
comvert1.FromDualQty.RateToBase == UOMConvertRatio.GetRationBy(……);
}
if (convert1.ToQty.RateToBase == new decimal(0))
{
comvert1.FromDualQty.RateToBase == UOMConvertRatio.GetRationBy(……);
}
正确的做法是使用Decimal.Zero常量。另外,我们也可以学习这个设计手法,应用到类似场景中。
d)、使用StringBuilder做字符串连接。
2、不要使用空析构函数
如果类中包含析构函数,则创建对象时会在Finalize队列中添加对象的引用,以保证当对象无法到达时,人人可以调用到Finalize方法。垃圾回收 器在运行期间,会启动一个低优先级的线程处理该队列。相比之下,没有析构函数的对象就没有没有这些小号。如果析构函数为空,这个消耗就毫无意义,只会导致 性能降低!因此,我们尽量不要使用空的析构函数。
从实际情况来看,许多是曾经在析构函数中包含有处理代码,但后来因为种种原因被注释掉或者删除掉了,只留下一个空的析构函数。此时应该注意把析构函数本身注释掉或者删除掉。
3、实现IDisposable接口
垃圾回收事实上只支持托管内存的回收,对于其它的非托管的资源,例如:WindowsGDI句柄或数据库连接,在析构函数中是否资源有很大问题,原因是垃圾回收依赖于内存紧张情况,虽然数据库连接可能已濒临耗尽,但如果内存还很充足的话,垃圾回收是不会运行的。
C#的IDisposable接口是一种显式释放资源的机制。通过提供using语句,还简化了使用方式(编译器自动生成try…finally块,并在 finally块中调用Dispose方法)。对于申请了非托管资源的对象,应为其实现IDisposable接口,并保证资源一旦超出using语句范 围,即得到及时的释放。这对于构造函数健壮且性能优良的程序非常有意义!
为防止对象的Dispose方法不被调用的情况发生,一般还要提供析构函数,两者调用一个出来资源释放的公共方法。同时,Dispose方法应调用 System.GC.SuppressFinalize(this),告诉垃圾回收器无需在处理Finalize方法了。
原文地址:http://www.cnblogs.com/lijun198504/archive/2010/01/19/1651729.html
C#之垃圾回收的更多相关文章
- Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收
执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...
- 修改session垃圾回收几率
<?php //修改session垃圾回收几率 ini_set('session.gc_probability','1'); ini_set('session.gc_divisor','2'); ...
- .NET面试题系列[5] - 垃圾回收:概念与策略
面试出现频率:经常出现,但通常不会问的十分深入.通常来说,看完我这篇文章就足够应付面试了.面试时主要考察垃圾回收的基本概念,标记-压缩算法,以及对于微软的垃圾回收模板的理解.知道什么时候需要继承IDi ...
- .net垃圾回收机制编程调试试验
1. 什么是CLR GC? 它是一个基于引用跟踪和代的垃圾回收器. 从本质上,它为系统中所有活跃对象都实现了一种引用跟踪模式,如果一个对象没有任何引用指向它,那么这个对象就被认为是垃圾对象,并且可以被 ...
- Java垃圾回收
垃圾收集算法 引用计数 堆中的每个对象都有一个引用计数,当对象被引用时引用计数加1,当对象的引用被重新赋值或超出有效区域时引用计数减1,当一个对象被回收后,它所引用的对象的引用计算减1.当一个对象的引 ...
- JavaScript具有自动垃圾回收机制
JavaScript具有自动垃圾回收机制 原理: 找出那些不再继续使用的变量,然后释放其占用的内存. 正常的生命周期: 局部变量指在函数执行的过程中存在.而在这个过程中,会为局部变量在栈或 ...
- .NET 垃圾回收与内存泄漏
> 前言相信大家一定听过,看过甚至遇到过内存泄漏.在 .NET 平台也一定知道有垃圾回收器,它可以让开发人员不必担心内存的释放问题,因为它会自定管理内存.但是在 .NET 平台下进行编程,绝对不 ...
- JavaScript 垃圾回收
在公司经常会听到大牛们讨论时说道内存泄露神马的,每每都惊羡不已,最近精力主要用在了Web 开发上,读了一下<JavaScript高级程序设计>(书名很唬人,实际作者写的特别好,由浅入深)了 ...
- C#技术漫谈之垃圾回收机制(GC)
GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是 ...
- Java的垃圾回收和内存分配策略
本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不 ...
随机推荐
- 【Node】package.json
npm的package.json中文文档https://github.com/ericdum/mujiang.info/issues/6
- ARC模式下的单例写法
// 单例 + (id)sharedInstance { __strong static id sharedObject = nil; static dispatch_once_t onceToken ...
- 【Android 复习】:Android之ViewFlipper(二)
通过手势移动屏幕 上面是通过屏幕上的按钮来在屏幕间切换的,这看起来多少有点不符合Android的风格,如果要是能通过手势的左右滑动来实现屏幕的切换就比较优雅了. 通过android.view.Gest ...
- IIS出现Server Error in '/' Application.CS0016的解决办法
这两天一直在弄IIS的事,全都是报错,网上找了好多资料,也尝试了很多,终于在几分钟之前把困扰了我一周的麻烦给解决了,现整理出来,希望对大家有用,闲话少说,直接上图了 Server Error in ' ...
- HDU-2700 Parity
http://acm.hdu.edu.cn/showproblem.php?pid=2700 题目意思很重要: //e:是要使字符串中1的个数变成偶数.o:是要使字符串中1的个数变成奇数 Parit ...
- Toad for Oracle 使用文档
Toad®for Oracle 版本 12.0.1 发行说明 30 July 2013 目录 欢迎使用 Toad for Oracle 版本更新 解决的问题和改进 已知问题 第三方已知问题 升级和兼容 ...
- Android 2014年1月22日
一.广播优先顺序 Android广播有两个很重要的要素: 1 广播 - 用于发送广播 有序广播 - 被广播接收器接收后,可被终止,无法往下继续传达. 典型代表:短信广播 普通 ...
- Yii之权限管理扩展 srbac
最近在研究 Yii 的权限控制功能,尽管Yii 自身提供了一个简单的权限管理,但是很多时候,我们还是需要对其做一点扩展. 在这里,我向大家推荐一个不错的扩展:SRBAC. 在Yii的官方网站的exte ...
- 武汉Uber优步司机奖励政策(2月1日~2月7日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- KVM虚拟化技术
KVM虚拟化技术 Qemu-kvm kvm virt-manager VNC Qemu-kvm创建和管理虚拟机 一.KVM简介 KVM(名称来自英语:Kernel-basedVirtual Machi ...