打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
垃圾收集的认识与思考——.NET GC

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

  • 完全以手工方式使应用程序代码完成这些工作
  • 让对象维护引用计数

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

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

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

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

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

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
快速理解.NET Framework (2)
.net下开发COM 组件(1)
浅析.Net下的AppDomain编程
.Net扫盲
为你解疑:CLR是什么?
CLR(公共语言运行时,Common Language Runtime)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服