.Net Framework垃圾收集具体算法详解
创始人
2024-06-19 15:41:22
0

.Net Framework是由微软提供的一款基于.NET开发的基础环境。不过在这个编程平台下,我们还可以使用其他各种语言来进行代码的编写,大大提高了程序员的开发效率。在这里就先来了解一下.Net Framework垃圾收集的相关算法。#t#

1..Net Framework垃圾收集只有在第0代对象充满时才会出现。

2.每组应用程序都有一组根,一个根是一个存储位置,其中包含着一个指向引用类型的内存指针。同时,当JIT编译器编译一个方法的IL代码时,除产生本地CPU代码外,JIT编译器还会创建一个内部表,该表的每个条目包含一个方法的本地CPU指令的字节偏移范围,及该范围中的一组包含跟的内存地址。

3.当垃圾收集器开始执行时,它先假设应用程序中没有一个根引用着托管堆中的对象。然后,遍历所有的根,构造出一个包含所有可达对象的图。任何不在该图中的对象都将是应用程序不可访问的对象 ,也是可以被执行垃圾收集的对象。

为什么.Net Framework垃圾收集的功能如此强大,而ANSI C++没有采用它?

这是因为垃圾收集器必须能够识别出应用程序的根,并且还要找到所有的对象指针。非托管C++允许我们进行类型转换,而无从知道它真正引用的对象是什么。在CLR中,托管堆总能知道一个对象的实际类型,从而使其元数据信息来判断一个对象的哪些成员引用着其他的对象。

任何封装了非托管资源的类型,例如文件、网络链接、套接字、互斥体等,都必须支持一种称作终止化(Finalization)的操作。终止化操作允许一种资源在它所占用的内存被回收之前首先执行一些清理工作。

如果一个封装了非托管资源的类型没有定义Finalize方法,那么这些托管资源将得不到关闭,从而导致某种程度的资源泄露,直到进程结束,这些非托管资源才会被操作系统回收。

Finalize方法的问题在于我们不能确定它会在何时被调用,而且它不是公有方法,因此不能显式调用它。

我们可以通过显示调用Dispose方法来释放对象所封装的非托管资源。

调用Dispose或Close方法只是在一个确定的时刻对对象占用的非托管资源执行清理操作而已,但不会控制托管堆中对象所使用的内存的生存期。这意味着我们在调用过Dispose或Close方法之后,对象的内存仍然存在,只是对象被执行资源清理后,不能再成功执行某些方法而已。

C#的using语句:编译时,编译器会自动产生一个try块和一个finally块,在finally块中,编译器会产生代码将变量转型为一个Idisposable接口,并调用其上的Dispose方法。

但我们应谨慎使用C#的using语句,避免过早的执行了资源清理

垃圾收集器中代龄的工作机制:CLR的托管堆支持3个代龄,但初始化时,它会为这三代选择3个阈值容量,选择阈值容量是为了提高系统性能,阈值容量越大,垃圾收集执行的频率也就越低。

另外,CLR垃圾收集器还有一个自调节的能力,会学习应用程序的行为,调节阈值容量,从而改变.Net Framework垃圾收集执行的频率,提高系统性能。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...