A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不是炎亚纶 中级黑马   /  2013-11-11 17:01  /  2509 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

垃圾回收机制是怎么工作的 ?

6 个回复

正序浏览
垃圾收集器会自动进行管理。当一个托管资源对象没有引用指向时,垃圾回收器会自动调用GC.collect释放该对象。c/c++中由程序员进行对象的回收像学校食堂中由学生收盘子。.net中由GC进行垃圾回收像场馆中店员去回收盘子。
回复 使用道具 举报
一席倾城 发表于 2013-11-13 20:35
圾回收器是用来管理应用程序的内存分配和释放的。在垃圾回收器出现以前,程序员在使用内存时需要向系统申请 ...

想了解基本的推荐看下C#编程基础,深入的可以看下C#高级编程想,写的特别好
回复 使用道具 举报
圾回收器是用来管理应用程序的内存分配和释放的。在垃圾回收器出现以前,程序员在使用内存时需要向系统申请内存空间。有些语言,例如Visual Basic,可以自动完成向系统申请内存空间的工作。但是在诸如Visual C++的语言中要求程序员在程序代码中申请内存空间。如果程序员在使用了内存之后忘了释放内存,则会引起内存泄漏。但是有了垃圾回收器,程序员就不必关心内存中对象在离开生存期后是否被释放的问题。当一个应用程序在运行的时候,垃圾回收器设置了一个托管堆。托管堆和C语言中的堆向类似,但是程序员不需要从托管堆中释放对象,并且在托管堆中对象的存放是连续的。

  每次当开发人员使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。新创建的对象被放在上次创建的对象之后。垃圾回收器保存了一个指针,该指针总是指向托管堆中最后一个对象之后的内存空间。当新的对象被产生时,运行库就知道应该将新的对象放在内存的什么地方。同时开发人员应该将相同类型的对象放在一起。例如当开发人员希望向数据库写入数据的时侯,首先需要创建一个连接对象,然后是Command对象,最后是DataSet对象。如果这些对象放在托管堆相邻的区域内,存取它们就非常快。

  当垃圾回收器的指针指向托管堆以外的内存空间时,就需要回收内存中的垃圾了。在这个过程中,垃圾回收器首先假设在托管堆中所有的对象都需要被回收。然后它在托管堆中寻找被根对象引用的对象(根对象就是全局,静态或处于活动中的局部变量以及寄存器指向的对象),找到后将它们加入一个有效对象的列表中,并在已经搜索过的对象中寻找是否有对象被新加入的有效对象引用。直到垃圾回收器检查完所有的对象后,就有一份根对象和根对象直接或间接引用了的对象的列表,而其它没有在表中的对象就被从内存中回收。
回复 使用道具 举报 1 0
知识有限 只能把知道的告诉你

什么叫资源回收: 我们理解为 所有的东西都是占用内存的,有些方法或者变量我们用完了需要去释放掉(也就是在内存中把他清空) 这种机制叫资源回收

目前已知C# 自动资源回收用到的方法是  using()
回复 使用道具 举报
在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理. (了解更多区别请参阅.NET Framework或C#的高级编程资料)
托管资源在.NET Framework中又分别存放在两种地方: "堆栈"和"托管堆"(以下简称"堆");规则是,所有的值类型(包括引用和对象实例)和引用类型的引用都存放在"堆栈"中,而所有引用所代表的对象实例都保存在堆中。

以上的是我在博客园看到的文章的开头,将这篇文章分享给你,希望对你有帮助
http://www.cnblogs.com/anorthwolf/archive/2009/12/07/1618744.html
回复 使用道具 举报
NET中的垃圾回收机制是引用程序对内存的回收和释放。当每次用new关键字创建一个对象时,运行库都要从托管堆中为其分配内存,因为空间是有限的,最终垃圾回收机制是要回收不用的内存的。已释放内存,重新使用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马