.net 垃圾回收机制

很早就知道垃圾回收了,也许以前看过些,但是忘记了,这次读 C#高级编程第四版时看到,记下来以便以后温习

垃圾收集器用来在.NET中进行内存管理,特别是它可以恢复正在运行中的应用程序需要的内存。到目前为止,Windows平台已经使用了两种技术来释放进程向系统动态请求的内存:

       完全以手工方式使应用程序代码完成这些工作。

       让对象维护引用计数。

让应用程序代码负责释放内存是低级、高性能的语言使用的技术,例如C++。这种技术很有效,且可以让资源在不需要时就释放(一般情况下),但其最大的缺点是频繁出现错误。请求内存的代码还必须明确通知系统它什么时候不再需要该内存。但这是很容易被遗漏的,从而导致内存泄漏。

尽管现代的开发环境提供了帮助检测内存泄漏的工具,但它们很难跟踪错误,因为直到内存已大量泄漏从而使Windows拒绝为进程提供资源时,它们才会发挥作用。到那个时候,由于对内存的需求,会使整个计算机变得相当慢。

维护引用计数是COM对象采用的一种技术,其方法是每个COM组件都保留一个计数,记录客户机目前对它的引用数。当这个计数下降到0时,组件就会删除自己,并释放相应的内存和资源。它带来的问题是仍需要客户机通知组件它们已经完成了内存的使用。只要有一个客户机没有这么做,对象就仍驻留在内存中。在某些方面,这是比C++内存泄漏更为严重的问题,因为COM对象可能存在于它自己的进程中,从来不会被系统删除(C++内存泄漏问题上,系统至少可以在进程中断时释放所有的内存)

.NET运行库采用的方法是垃圾收集器,这是一个程序,其目的是清理内存,方法是所有动态请求的内存都分配到堆上(这对所有的语言都一样,但.NET中,CLR维护它自己的托管堆,以供.NET应用程序使用).NET检测到给定进程的托管堆已满,需要清理时,就调用垃圾收集器。垃圾收集器处理目前代码中的所有变量,检查对存储在托管堆上的对象的引用,确定哪些对象可以从代码中访问—— 即哪些对象有引用。没有引用的对象就不能再从代码中访问,因而被删除。Java就使用与此类似的垃圾收集系统。

之所以在.NET中使用垃圾收集器,是因为中间语言已用来处理进程。其规则要求,第一,不能引用已有的对象,除非复制已有的引用。第二,中间语言是类型安全的语言。在这里,其含义是如果存在对对象的任何引用,该引用中就有足够的信息来确定对象的类型。

垃圾收集器机制不能和诸如非托管C++这样的语言一起使用,因为C++允许指针自由地转换数据类型。

垃圾收集器的一个重要方面是它是不确定的。换言之,不能保证什么时候会调用垃圾收集器:.NET运行库决定需要它时,就可以调用它(除非明确调用垃圾收集器)。但可以重写这个过程,在代码中调用垃圾收集器。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值