- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
残余收受接管机制
垃圾回收机制
一、
C# 中的垃圾回收机制(转载)
很多系统都有其自身的垃圾回收,其回收机制大体是相同的。它们使程序员从跟踪内存使用的繁重任务中解脱出来。虽然大多数回收器都要求应用程序不时地暂停从而释放不再使用的内存。但C#中的回收器效率还是很高的。
垃圾回收器的基本假定:
1.被分配内存空间的对象最有可能被释放。在方法执行时,就需要为该方法的对象分配内存空间,搜索最近分配的对象集合有助于花费最少的代价来尽可能多地释放内存空间。
2.生命期最长的对象释放的可能性最小,经过几轮垃圾回收后,对象仍然存在,搜索它时就需要进行大量的工作,却只能释放很小的一部分空间。
3.同时被分配内存的对象通常是同时使用,将它们彼此相连有助于提高缓存性能和回收效率 。
C#中的回收器是分代的垃圾回收器(Gererational Garbage Collector) 它将分配的对象分为3个类别或代。(可用GC.GetGeneration方法返回任意作为参数的对象当前所处的代) 最近被分配内存的对象被放置于第0代,因为第0代很小,小到足以放进处理器的二级(L2)缓存,所以它能够提供对对象 的快速存取。经过一轮垃圾回收后,仍然保留在第0代中的对象被移进第1代中,再经过一轮垃圾内存回收后,仍然保留在第1代中的对象则被移进第2代中,第2代中包含了生存期较长的对象。
在C#中值类型是在堆栈中分配内存,它们有自身的生命周期,所以不用对它们进行管理,会自动分配和释放。而引用类型是在堆中分配内存的。所以它的分配和释放就需要像回收机制来管理。C#为一个对象分配内存时,托管堆可以立即返回新对象所需的内存,因为托管堆类似于简单的字节数组,有一个指向第一个可用内存空间的指针,指针像游标一样向后移动,一段段内存就分配给了正在运行的程序的对象。在不需要太多垃圾回收的程序小,托管堆性能优于传统的堆。
当第0代中没有可以分配的有效内存时,就触发了第0代中的一轮垃圾回收,它将删除那些不再被引用的对象,并将当前正在使用的对象移至第1代。而当第0代垃圾回收后依然不能请求到充足的内存时,就启动第1代垃圾回收。如果对各代都进行了垃圾回收后仍没有可用的内存就会引发一个OutOfMemoryException异常。
终结器
在有些情况下,类可以提供一个终结器在对象被销毁时执行,终结器是一个名为Finalize的受保护的方法:
protected void Finalize()
{
base.Finalize();
//释放外部资源
}
垃圾回收器使用名为“终止队列”的内部结构跟踪具有 Finalize 方法的对象。每次您的应用程序创建具有 Finalize 方法的对象时,垃圾回收器都在终止队列中放置一个指向该对象的项。托管堆中所有需要在垃圾回收器回收其内存之前调用它们的终止代码的对象都在终止队列中含有项。(实现 Finalize 方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们。用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收。当垃圾回收器执行回收时,它只回收没有终结器的不可访问对象的内存。这时,它不能回收具有终结器的不可访问对象。它改为将这些对象的项从终止队列中移除并将它们放置在标为准备终止的对象列表中。该列表中的项指向托管堆中准备被调用其终止代码的对象。垃圾回收器为此列表中的对象调用 Finalize 方法,然后,将这些项从列表中移除。后来的垃圾回收将确定终止的对象确实是垃圾,因为标为准备终止对象的列表中的项不再指向它们。在后来的垃圾回收中,实际上回收了对象的内存。)
Dispose方法
在不使用终结器时,可以考虑使用Dispose方法,你可以使用这个方法来释放所保存包括的在托管对象引用在内的任何资源。但使用它时需用GC.SuppressFinalize来告知运行时这些对象不需要终结。如下所示:
public void Dispose()
{
object.Dispose();
dbConnection.Dispose();
GC.SuppressFinalize(this); //申明不需要终结
}
创建并使用了Dispose方法的对象,就需要使用完该对象之后调用这些方法,最好是在Finally中调用。
//以下代码演示来自MSDN
// Design pattern for the base class.
// By implementing IDisposable, you are announcing that instances
// of this type allocate scarce resources.
public class BaseResource : IDisposable
{
// Pointer t
您可能关注的文档
- 来料、成品抽样考验标准.doc
- 杨××休和解议仲裁署理词.doc
- 杭州大师长教师创业优惠政策.doc
- 构造题集.doc
- 林业培训 演示文稿.ppt
- 林业处分法度模范.doc
- 林业局小我先辈事迹资料.doc
- 林业家当技巧.doc
- 构建适应现代国际物流长大的海关大监管系统之我见.doc
- 林业标准化促进林业保险发展的机理分析.pdf
- 2025-2030中国触摸显示屏市场发展分析及市场趋势与投资方向研究报告.docx
- 2025年四川省绵阳市北川羌族自治县中考一模语文试题(原卷版).docx
- 2025-2030中国触摸显示屏行业深度调研及前景趋势与投资发展研究报告.docx
- 2025-2030中国触摸屏电脑行业市场发展现状及竞争格局与投资前景研究报告.docx
- 2025-2030中国触觉感应器行业市场发展趋势与前景展望战略研究报告.docx
- 2025-2030中国触觉反馈技术行业市场发展趋势与前景展望战略研究报告.docx
- 老年人创业支持与培训计划.docx
- 2025-2030中国触觉马达行业市场发展趋势与前景展望战略研究报告.docx
- 2025-2030中国触觉行业市场现状供需分析及投资评估规划分析研究报告.docx
- 2025年山东省泰安市东平县中考一模语文试题(解析版).docx
文档评论(0)