.net framework 垃圾回收机制

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
首先,让我们来了解下什么是垃圾回收机制。

为了使程序员从跟踪内存使用的繁重任务中解脱出来,利用充分的时间去完成业务逻辑,因此产生了垃圾回收机制,虽然大多数的垃圾回收器都要求应用程序不停地暂停从而释放出不在使用的资源,但是.NET的垃圾回收器效率依然很高。

垃圾回收器的基本思想:

      寻找不再使用的对象,将他们从内存中删除,并压实托管堆以释放不在使用的对象所占用的内存。在堆被压实之后,所有的对象引用都将被调整为指向对象新的存储位置。

垃圾回收机制的功能:用来管理托管资源和非托管资源所占用的内存分配和释放。

垃圾回收器的基本假定:

1.     最近被分配的内存空间的对象最有可能需要被释放。在方法执行时,通常需要为该方法所使用到的对象分配内存空间,搜索最近被分配的对象集合有助于花费最少的工作来释放尽可能多的空闲内存空间。

2.     生命期最长的对象需要释放的可能性最小。在通过几轮的垃圾回收后仍然存在的对象不大可能是那种能够在下一轮回收中被释放的临时对象,搜索这些内存块往往要进行大量的工作,却只能释放很小一部分的内存空间。

3.     同时分配内存的对象通常也会同时使用,将同时分配内存的对象的存储位置彼此相连有助于提高缓存性能,在垃圾回收时也往往是同一批处理或者是遵循后分配,先释放原则。

.NET 框架的垃圾回收器被称为分代的垃圾回收器( Generational Garbage Conllector ),也就是说被分配的内存分为三个类别(生存期等级),或者说分为三代,即012三代,对应的托管堆的初始化大小分别是256K2M10M。当垃圾回收器在发现改变托管堆的大小能够提高性能的话,会改变托管堆的大小。例如:当应用程序实例化了一些占用内存较少的对象时,而且这些对象所占用的资源能被很快回收的话,0代托管堆的大小会变为128K.相反,如果垃圾回收器发现所占用的资源不能被很快回收的话,会增加托管堆的大小,这时就是512k了。(注意:前提是:当垃圾回收器在发现改变托管堆的大小能够提高性能的话,才会改变托管堆的大小。)

最近被分配的内存空间的对象被放置在第0代,一般存储于二级缓存中,所以能对第0代中的对象实现快速存取。经过一轮垃圾回收后,仍然保留在第0代中的对象则被移进第1代中,再经过一轮垃圾回收后,仍然保留再第1代中的对象则被移进第2代中,第2代中包含了生存期较长的对象,这些对象至少经过了两轮回收。

现在来考虑一个问题,为什么要将本轮中没有被回收掉的对象移到下一代中呢?朋友们如果对上面的内容理解了,那么这个问题的也就迎刃而解了。是的,就是为了把存取速度较快的空间给置空,分配给最近实例化的对象,为了提高效率用来实现对象的快速读取的。

   

现在来看看托管堆上的内存分配问题:

      当程序请求为某对象分配空间时,托管堆上的指针会指向下一个最近的可用的内存空间,如下图所示:

      由此图我们可以清晰的知道托管堆的内存分配是线性分配的,

 

当然,这种分配方式的效率也是最高的。而普通的堆对于内存分配是基于内存块大小的,两个同时声明的对象在普通堆上被分配的位置可能相隔较远,于是降低了缓存的性能。所以,在一个不需要太多垃圾回收的应用程序中,托管堆的表现会优于传统的堆。

下面来学习使用终结器[ Finalize()方法]

Protected void Finalize( ) {   Base.Finalize();    }

类提供一个终结器以在对象被销毁时执行 ,值得注意的是: 当一个对象实现了Finalize方法,垃圾回收器会在它的终结列表(Finalization List)中加入一个指向该对象的指针(终结列表中包含的是等待终结的对象)。

 

等到此轮垃圾回收开始时,垃圾回收器会将该对象的引用置入终结列表,标识此对象为等待终结的对象,虽然此对象现在仍然存在,但是在应用程序中已经引用不到该对象了。垃圾回收器在此轮使用一个专用的线程,使终结列表中的对象执行终结器,执行完终结器的对象会被此对象标记为不再需要终结的对象,并从终结列表中除去。

终结完成后,对象所占用的资源将在下一轮垃圾回收中被回收。 

 

ASP.NET Core 中的内存管理和垃圾回收 (GC) ASP.NET Core 中的内存管理和垃圾回收(GC) GC 会分配堆段,其中每个段都是一系列连续的内存。 置于堆中的对象归类为 3 个代系之一:0、1 或 2。 代系可确定 GC 尝试在应用不再引用的托管对象上释放内存的频率。 编号较低的代系会更加频繁地进行 GC。 对象会基于其生存期从一个代系移到另一个代系。 随着对象生存期延长,它们会移到较高代系。 如前所述,较高代系进行 GC 的频率较低。 短期生存的对象始终保留在第 0 代中。 阅读详情

相关推荐

垃圾回收:在微软.NET框架自动内存管理

这个一个解释.NET框架垃圾回收机制的一个很好的文章,希望能够帮助到初学者。这是Jeffrey Richter 2000年在MSDN杂志上的文章。

.NET垃圾回收机制详解与心得体会(转自Great Hopes Make Great Man)

原贴:http://hi.baidu.com/toughguy/blog/item/d84daef8e48be50dd9f9fdb0.html这几天对垃圾回收机制有了较为透彻的理解,在此与朋友们分享一下。首先,让我们来了解下什么是垃圾回收机制。为了使程序员从跟踪内存使用的繁重任务中解脱出来,利用充分的时间去完成业务逻辑,因此产生了垃圾回收机制,虽然大多数的垃圾回收器都要求应用程序不停地暂停

孤夜寒心泪学习随笔 1145

Obsidian免费同步全攻略:手把手教你用OneDrive+Remotely Save插件跨设备同步笔记

本文提供了一份详细的Obsidian免费同步方案指南,核心是利用OneDrive云存储与Remotely Save插件实现跨设备笔记同步。文章手把手教学,涵盖插件安装、OneDrive授权配置、桌面端与移动端的同步设置,并解答了常见问题,帮助用户在不依赖官方付费服务的情况下,构建稳定、自主的免费同步工作流。

bash7scripter的博客 820

.NET中栈和堆的比较 #4

终于翻完了第四篇,本来每次都是周末发的,可惜上周末有些事儿没忙过来,所以今天中午给补上来。不知道这套文章还能不能继续了,因为作者也只写到了第四篇,连他都不知道第五篇什么时候出得来...原文出处http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory_401282006141834PM/csharp_memory_4.aspx可以...

weixin_30501857的博客 222

.Net 垃圾回收详解

定义:.NET Framework提供了一个垃圾收集器(Garbage Collector),它是一个后台线程,周期性地运行,负责扫描和标记不再被引用的对象,并释放它们占用的内存。目标:通过自动回收内存来避免内存泄漏,减少手动内存管理的工作量,增强程序的安全性。

Code365 1226

.NET高级面试指南专题八【 垃圾回收机制GC】

总体而言,.NET垃圾回收机制是CLR(Common Language Runtime)的一部分,它通过自动追踪和释放不再使用的对象,确保.NET应用程序的内存使用是高效和可靠的。需要注意的是,垃圾回收的触发时机是由垃圾回收器实现决定的,具体情况可能会因编程语言、运行时环境和垃圾回收算法的不同而异。垃圾回收的触发条件一般与各代的内存使用情况相关。例如,新生代的触发条件可能是新生代的内存空间即将用完,中生代的触发条件可能是新生代的回收次数达到一定阈值,老生代的触发条件可能是老生代的内存空间即将用完。

一个专注于技术研究创新的程序员 2009

关于.NET FrameWork 中的垃圾回收机制

GC是垃圾收集器(Garbage Collection)。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手工回收,一个例子就是FileStream或者SqlConnection需要程序员调用Dispose进行资源的回收。 1 //基础知识:当没有任何变量指向一个对象的时候对象就可以被回收掉了,但不一定会...

weixin_30723433的博客 166

.net中的垃圾回收机制

<br /> .NET Framework垃圾回收器管理应用程序的内存分配和释放。每次使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。但是,内存不是无限大的。最终,垃圾回收器必须执行回收以释放一些内存。垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。

hawking3000的专栏 462

.NET垃圾回收机制

.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理. (了解更多区别请参阅.NET Framework或C#的高级编程资料) 托管资源在.NET Framework中又分别存...

weixin_30477797的博客 56

.NET垃圾回收机制

  在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理. (了解更多区别请参阅.NET Framework或C#的高级编程资料)   托管资源在.NET Framework中又分

梦想MVP 8725

【CSharp】垃圾回收

NET Framework垃圾回收机制非常复杂,但平时编程不需要了解它的全部细节。事实上,它设计得是如此周到,以至于根本不会妨碍到你。但是,如果对技术细节感兴趣,就继续阅读这个补充内容。 对象内存从托管堆中分配,这是.NET运行时专门用来存储动态分配对象的区域。每次分配都在堆中划出一定空间 ,而堆内存可能耗尽,或者更有可能的是,一次分配找不到一个足够大的连续空间。如果内存分配失败,就会调用垃圾回收器检查是否存在没人引用的对象,以便回收其内存来 释放出一些堆内存。 基本过程如下所示: 找出所有仍然活动的

zhy29563 350

浅谈.NET垃圾回收机制

抽空看了一下.net垃圾回收机制,感觉这篇文章写得还不错,描述比较详细。 不过还是不怎么懂,分享出来共同学习吧。 垃圾收集器(GarbageCollection)是组成.Net平台一个很重要的部分,.NET垃圾回收机制降低了编程复杂度,使程序员不必分散精力去处理析构。不妨碍设计师进行系统抽象。减少了由于内存运用不当产生的Bug。成功的将内存管理工作从程序的编写时,脱离至运行...

devk72522的博客 222

[转载]NET垃圾回收机制

.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理. (了解更多区别请参阅.NET Framework或C#的高级编程资料) 托管资源在.NET Framework中又...

weixin_30443813的博客 160

.Net垃圾回收机制(GC)之拙见——托管类型的垃圾回收

各种语言的垃圾回收在IT界噪的沸沸扬扬,有极大的优化同时也有瓶颈。 而在.Net中的垃圾回收机制又是怎样的呢? 众所知周,.Net中的垃圾回收机制是由.Net Framework托管的,带给开发者最大的好处就是省去了手动进行垃圾回收的麻烦。 在虚拟内存当中,有个区域称为“栈”,这个数据结构完全符合“先进后出(FILO)”的特性。 在C#中,有个名词叫作用域,作用域表示了一个变量的...

aqm63700的博客 174

理解C#垃圾回收机制

<br />  原文:http://blog.csdn.net/thy822/archive/2009/12/22/5056922.aspx    <br />很多系统都有其自身的垃圾回收,其回收机制大体是相同的。它们使程序员从跟踪内存使用的繁重任务中解脱出来。虽然大多数回收器都要求应用程序不时地暂停从而释放不再使用的内存。但C#中的回收器效率还是很高的。<br />      垃圾回收器的基本假定:<br />         1.被分配内存空间的对象最有可能被释放。在方法执行时,就需要为该方法的对象分配

xh491464429的专栏 2078

.NET垃圾回收机制[引用]

.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理. (了解更多区别请参阅.NET Framework或C#的高级编程资料) 托管资源在.NET Framework中又分别存...

weixin_30922589的博客 79

c#垃圾回收机制

1:垃圾回收机制 CLR托管堆: (1)第0代--预算容量256k (2)第1代--预算容量2M (3)第2代--预算容量10M 注:在不同的程序中,托管堆上的实际内存管理对象的容量可能不会按照预算容量大小开辟 当第0代对象充满的时候,会自动进行垃圾回收那些标记的“垃圾对象”,这时第0代中未被标记的对象成为了第1代,而新创建的对象变成第0代,以此类推,当第0代再次充满的时候会...

LILYCSDN2016的博客 259
上一篇: 虚方法(virtual)
下一篇: 析构函数(destructor)
zenolee
博客等级 码龄19年 3粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值