.Net中的垃圾回收

转载 2005年03月01日 19:24:00
近期看了看有关.net的垃圾回收方面的知识,感觉有必要将这方面的资料总结一下,和广大网友分享一下.net的垃圾回收,借鉴了java的垃圾回收机制。在以前的windows环境下,我们实例化一个对象后,我们经常会忘记释放掉已经无用的内存,或者试图使用已经释放掉的内存,造成程序的崩溃。但是随着.net中的垃圾回收机制出现,这种情况得到了大大的改善。 在.net中两种变量类型,一种是值类型,一种是引用类型,值类型所占的内存,存放在当前线程的栈上,垃圾回收不负责回收这方面的内存,当前方法运行完毕后,内存会自动释放。引用类型所占的内存存放在托管堆上,.net的垃圾回收就是负责回收这方面的内存资源。 在.net中提供三种模式来回收内存资源:dispose模式,finalize方法,close方法。 dispose提供了一种显示释放内存资源的方法。dispose调用方法是:要释放的资源对象.dispose finalize方法是.net的内部的一个释放内存资源的方法。这个方法不对外公开,由垃圾回收器自己调用。 close和dispose其实一样,只不过有的对象没有提供dispose的方法,只提供了close方法,而close其实在那个对象的类中,依然是调用了一个私有的dispose方法,而finalize其实也是调用一个不对外公开的dispose方法 那么既然.net在垃圾回收中了finalize方法,那么为什么还要提供dispose方法和close方法哪?这是因为finalize方法会释放掉托管堆内存和非托管堆内存。而dispose只会释放掉非托管的内存资源,对于托管的内存资源它不会释放,只能由垃圾回收拉释放。 当我们打开一个数据库连接的时候(这是一个非托管内存资源),如果我们不手工释放这一部分资源,等下一次垃圾回收调用finalize方法回收资源,那么可能会是很长的时间之后,所以要使用dispose这个方法。所以当我们使用 sqlconnection这个对象连接数据库后,调用sqlconnnection.dispose方法后,可以从数据库断开连接,但是sqlconnection这个对象没有消亡,这个对象可以继续使用,直到下一次垃圾回收调用finalize方法回收资源。 我们再说一下close这个方法,我们上面提到过了,它起到的作用和dispose一样。只不过有的.net有的对象没有提供dispose方法,而是用close代替,因为用close代替,比dispose显得更直观。 下面用一个例子说明finalize和dispose,close的区别 大家看下面的代码 dim a as string="1234" dim fs as filestream("temp.txt",fileMode,create) fs.write(a) ''''向文件写入内容 fs.dispose() '''显示关闭文件 fs.write(a) ''''抛出错误 因为当我们调用了dispose方法,我们只是关闭了temp.txt文件,fs对象是一个托管对象,他的资源没有被释放,依然可以使用,但是temp.txt文件已经关闭,向一个已经关闭的文件写入内容,当然会出错。 大家再看下面的代码 dim a as string="1234" dim fs as filestream("temp.txt",fileMode,create) dim bw as new binarywrite(fs) bw.write(a) ''''向文件写入内容 bw.dispose() '''显示关闭文件,我们调用binarywriter.close会同时关闭filestream对象,所以不用调用fs.close方法binarywriter接受一个filestream为对象,当我们向binarywriter对象写入数据时,其实保存在内存缓冲中,当内存缓冲写满时,binarywriter才会将数据写入文件中。 我们调用bw.dispose会导致binarywriter对象将数据填入到filestream中,同时关闭filestream对象,当filestream对象关闭,它会将缓冲区的内容填入到磁盘文件中。而如果我们没有显示的调用dispose或者close方法,垃圾回收器会先中止filestream对象,关闭文件。这样缓冲区的内容会丢失,写入失败。

相关文章推荐

.NET_C#_栈_堆_垃圾回收GC

  • 2013年01月10日 11:19
  • 528KB
  • 下载

对.Net 垃圾回收Finalize 和Dispose的理解

引用地址:http://liuzhiwei.cnblogs.com/archive/2006/06/28/437662.html 我们先来谈谈析构函数。 析构函数是不可继承...

.NET 垃圾回收堆透析

在的 MSDN 杂志六月 2009年文章的.NET 应用程序的审核内存使用量",我们讨论了使用任务管理器,PerfMon VADump 之类的工具的监视内存消耗。这些工具帮助监视您的应用程序的总体内存...

.Net内存管理、垃圾回收

1. Stack和Heap    每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况。值类型变量(函数的参数、局部变量等非成员变量)都分配在...

.Net 垃圾回收和大对象处理

CLR垃圾回收器根据所占空间大小划分对象。大对象和小对象的处理方式有很大区别。比如内存碎片整理 —— 在内存中移动大对象的成本是昂贵的,让我们研究一下垃圾回收器是如何处理大对象的,大对象对程序性能有哪...

浅谈.NET垃圾回收

本篇博客简单地从以下几个方面讨论一下.net的垃圾回收(GC)问题 何时进行垃圾回收 回收哪些对象 回收过程和回收算法 编程建议 何时进行垃圾回收 一般情况下,.net在创建对象时发现托管堆...

.NET 垃圾回收浅解

在说明垃圾回收的实现机制之前,先说明一下垃圾回收存在的背景。 垃圾回收器(GC)是.NET平台中一个很重要的组成部分,.NET垃圾回收机制降低了编写程序的复杂程度,使程序员不用耗费精力去处理析构,成功...

.NET垃圾回收的机制解释

首先,对象分为值类型和引用类型,值类型在用完后是由操作系统自动回收的,引用类型由垃圾回收器回收,所以提到垃圾回收肯定是对引用类型来说的。 垃圾回收机制是为了解决内存泄漏问题,即对象在用完后,其占用的...

.Net 垃圾回收和大对象处理

CLR垃圾回收器根据所占空间大小划分对象。大对象和小对象的处理方式有很大区别。比如内存碎片整理 —— 在内存中移动大对象的成本是昂贵的,让我们研究一下垃圾回收器是如何处理大对象的,大对象对程序性能有哪...

【小松教你手游开发】【面试必读(编程基础)】.NET垃圾回收:原理浅析

http://blog.jobbole.com/85435/
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.Net中的垃圾回收
举报原因:
原因补充:

(最多只允许输入30个字)