浅谈.NET垃圾回收机制

   抽空看了一下.net的垃圾回收机制,感觉这篇文章写得还不错,描述比较详细。 不过还是不怎么懂,分享出来共同学习吧。

  垃圾收集器(GarbageCollection)是组成.Net平台一个很重要的部分,.NET垃圾回收机制降低了编程复杂度,使程序员不必分散精力去处理析构。不妨碍设计师进行系统抽象。减少了由于内存运用不当产生的Bug。成功的将内存管理工作从程序的编写时,脱离至运行时的优点。

  1. 关于垃圾回收

          在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理. 需要手动清理垃圾(显式释放)。

          托管资源在.NET Framework中又分别存放在两种地方: "堆栈"和"托管堆"(以下简称"堆");规则是,所有的值类型(包括引用和对象实例)和引用类型的引用都存放在"堆栈"中,而所有引用所代表的对象实例都保存在堆中。在C#中,释放托管资源是可以自动通过"垃圾回收器"完成的(注意,"垃圾回收"机制是.NET Framework的特性,而不是C#的).

          在C++时代,我们需要自己来管理申请内存和释放内存. 于是有了new, delete关键字. 还有的一些内存申请和释放函数(malloc/free). C++程序必须很好地管理自己的内存, 不然就会造成内存泄漏(Memory leak). 在.net时代, 微软为开发人员提供了一个强有力的机制--垃圾回收. 垃圾回收机制是CLR的一部分, 我们不用操心内存何时释放, 我们可以花更多精力关注应用程序的业务逻辑. CLR里面的垃圾回收机制用一定的算法判断某些内存程序不再使用,回收这些内存并交给我们的程序再使用.

  2.  

     垃圾回收的功能

         1、用来管理托管资源和非托管资源所占用的内存分配和释放。

         2、寻找不再使用的对象,释放其占用的内存, 以及释放非托管资源所占用的内存。

         3、垃圾回收器释放内存之后, 出现了内存碎片, 垃圾回收器移动一些对象, 以得到整块的内存,同时所有的对象引用都将被调整为指向对象新的存储位置。

  3.  

     回收内存的模式

         在.net中提供三种模式来回收内存资源:dispose模式,finalize方法,close方法。

         1、dispose提供了一种显示释放内存资源的方法。dispose调用方法是:要释放的资源对象.dispose().

         2、finalize方法是.net的内部的一个释放内存资源的方法。这个方法不对外公开,由垃圾回收器自己调用。

         3、close和dispose其实一样,只不过有的对象没有提供dispose的方法,只提供了close方法,而close其实在那个对象的类中,依然是调用了一个私有的dispose方法,而finalize其实也是调用一个不对外公开的dispose方法。

  4.  

     回收一般过程

         1、垃圾回收时机:托管堆满了,内存分配即将不足时,0代内存分配满了,或其他情况,微软没有公开该部分算法。程序员可以手动调用GC.Collect(),但是会有警告,微软并不建议这么做。

         2、垃圾确认:通过根来寻找可达的对象(以后添加),并做标记,然后回收没有标记的对象。

         3、垃圾回收:内存回收,对于实现了Finalize方法的对象请参考最上面1的介绍。

         4、内存转移,合并。垃圾回收后使得内存不连续,零碎,.Net会将利用的内存合并为连续的块,然后更新对象的指针。

  5.  

     注意的地方

         1、值类型(包括引用和对象实例)和引用类型的引用其实是不需要什么"垃圾回收器"来释放内存的,因为当它们出了作用域后会自动释放所占内存(因为它们都保存在"堆栈"中,学过数据结构可知这是一种先进后出的结构);

         2、只有引用类型的引用所指向的对象实例才保存在"堆"中,而堆因为是一个自由存储空间,所以它并没有像"堆栈"那样有生存期("堆栈"的元素弹出后就代 表生存期结束,也就代表释放了内存),并且非常要注意的是,"垃圾回收器"只对这块区域起作用; 

         3、"垃圾回收器"也许并不像许多人想象的一样会立即执行(当堆中的资源需要释放时),而是在引用类型的引用被删除和它在"堆"中的对象实例被删除中间有 个间隔,为什么呢? 因为"垃圾回收器"的调用是比较消耗系统资源的,因此不可能经常被调用!(当然,用户代码可以用方法System.GC.Collect()来强制执行"垃圾回收器")

        4、有析构函数的对象需要垃圾收集器两次处理才能删除:第一次调用析构函数时,没有删除对象,第二次调用才真正删除对象。

        5、由于垃圾收集器的工作方式,无法确定C#对象的析构函数何时执行。

        6、可实现IDisposable接口的Dispose()来显示释放由对象使用的所有未托管资源。

        7、垃圾收集器在释放了它能释放的所有对象后,就会压缩其他对象,把他们都移动回heap的端部,再次形成一个连续的块。

转载于:https://www.cnblogs.com/larry-th/p/6574284.html

手把手教您 Claude 桌面端无需账号订阅,免费接入国产自定义大模型(Claude Desktop 绕过订阅限制,接入任意自定义 AI 模型) 无需官方账号,也能畅玩Claude桌面端!本文详解Claude Desktop如何跳过登入接入自定义大模型,轻松解锁Cowork、Code等强大功能🚀 阅读详情

相关推荐

为什么一个“时间片”能折腾 Linux 十年?

时间片扩展不是抢占调度器的控制权,也不是提升优先级。在“非常短暂、非常确定”的用户态临界区内,避免线程被不必要地抢占。用户态自旋锁(user-space spinlock)无系统调用的极短临界区高并发、低延迟的数据结构操作RSEQ(Restartable Sequences)保护区间一旦线程在临界区被抢占,系统整体性能反而下降。线程 A 拿着一个用户态锁线程 B 被调度上来,开始自旋等这个锁但 A 因为时间片用完,被调度器切走CPU 白白空转,所有线程都在浪费时间。

网络技术联盟站 217

浅谈.NET垃圾回收

本篇博客简单地从以下几个方面讨论一下.net垃圾回收(GC)问题 何时进行垃圾回收 回收哪些对象 回收过程和回收算法 编程建议 何时进行垃圾回收 一般情况下,.net在创建对象时发现托管堆的内存不够用了,就会进行垃圾回收。除此之外,手动调用GCCollect()方法时也会进行回收,还有就是当windows报告低内存时以及应用程序关闭时,也都会进行垃圾回收。 当.net clr试图创建

朱登凯的专栏 1751

华为OD机试真题2026双机位C卷 C语言 实现【主次关联成环警告】

在ICT运维领域,现网运维工程师面向对设备上报的众多告警,往往需要筛选出最主要的告警优先处理,次等级的告警或许为同一个根因导致的告警,处理优先级会放后或者不处理,这样就诞生出主次关联告警的概念。给定一系列告警的主次关联关系,判断是否存在如下情况:

MISAYAONE的博客 149

深入理解.NET内存回收机制

[前言:].Net平台提供了许多新功能,这些功能能够帮助程序员生产出更高效和稳定的代码。其中之一就是垃圾回收器(GC)。这篇文章将深入探讨这一功能,了解它是如何工作的以及如何编写代码来更好地使用这一.Net平台提供的功能。   .Net中的内存回收机制  垃圾回收器是用来管理应用程序的内存分配和释放的。在垃圾回收器出现以前,程序员在使用内存时需要向系统申请内存空间。有些语言,例如Visual Ba...

weixin_34221073的博客 321

.Net Discovery系列之三 深入理解.Net垃圾收集机制(上)

前言: 组成.Net平台一个很重要的部分----垃圾收集器(Garbage Collection),今天我们就来讲讲它。想想看没有GC,.Net还能称之为一个平台吗?各种语言虽然都被编译成MSIL,但是运行时的资源回收工作却“各自为战”,这样不但增加了编程难度,也会使内存管理工作变得复杂无比(不同语言处理内存的微小差异,将在回收资源时被放大),更也不利于平台移植。 这篇文章将全面的为大家介绍....

weixin_34309543的博客 127

.Net高级技术——垃圾收集器

垃圾收集器概述   大排档和学校食堂。一个是别人帮你收拾盘子,一个是自己收拾盘子。   垃圾收集GC(Garbage Collection)。内存的分配、回收不需要程序员操心,程序员只要需要的时候new就可以,用完了不用管,有人帮你清除不用的内存。这个人就是“垃圾收集器”。.Net程序员一般不用像C++程序员那样处理内存的申请和回收,是因为有GC。 GC优点:程序员不用关心内存的申请和回收,...

weixin_34026276的博客 132

如何理解.net中的垃圾回收机制

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

weixin_33878457的博客 1714

浅谈.NET垃圾回收机制(GC)

 .NET自动内存管理将开发人员从内存错误的泥潭中解放出来,这一切都归功于垃圾回收(GC,Garbage Collection)机制。 通过对对象创建全过程的讲述,我们理解了CLR执行对象内存分配的基本面貌。一个分配了内存空间和完成初始化的对象实例,就是一个CLR世界中的新生命体,其生命周期大概可以概括为:对象在系统中进行一定的操作和应用,到一定阶段它将不被系统中任何对象引用或操作,则表示该对

188

C#浅谈C#垃圾回收机制

C#从入门到精通(第7版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用C#进行Windows应用程序开发方方面面的技术。

测试开发自动化 8951

浅谈GC 垃圾回收机制

其实作为小白的我写程序中根本不用管内存的分配和垃圾回收。但我想了解了解垃圾回收机制,于是稍微花了点时间研究了一下Microsoft .NET垃圾回收机制。看了一篇英文的介绍,好不容易翻译了一点(我是文章的搬运工,只是翻译了一遍,没有原创性)。如有理解错误的地方,敬请提出。 如果让我们自己写程序实现合理的资源管理,我想肯定很多人都写不出来(包括我)。资源管理对我们来说是一个困难、乏味的工作。也有...

记录和分享 608

浅谈DotNet垃圾回收机制

最近在做一个项目,用到了大量的非托管技术,所以垃圾回收变得很重要。 在说垃圾回收之前,先说说两个概念:托管代码,是由CLR管理的代码非托管代码,是由操作系统直接执行的代码在早期C++的时候...

farway000的博客 290

浅谈现代自动垃圾回收

1. 概述在传统的C/C++程序中,程序员需要显示地申请内存,然后在不需要的时候释放它。这样做虽然有很高的效率,但风险也是很大的。由于程序员需要自己来进行内存管理,这也难免会降低程序的开发效率。而目前的大多数应用都对效率本身的要求不会太高,那么我们是否可以找到一个兼顾效率和开发效率的方法来减轻程序员的负担,减少人工内存管理带来的风险呢?这就是自动垃圾回收。所谓的垃圾,也就是无用的内

麦田里的守望者 1989

浅谈c#垃圾回收机制(GC)

写了一个window服务,循环更新sqlite记录,内存一点点稳步增长。三天后,内存溢出。于是,我从自己的代码入手,查找到底哪儿占用内存释放不掉,最终明确是调用servi...

dotNET跨平台 524

浅谈C#垃圾回收-关于GC、析构函数、Dispose、and Finalize

对于.Net CLR的垃圾自动回收,这两日有兴致小小研究了一下。查阅资料,写代码测试,发现不研究还罢,越研究越不明白了。在这里sban写下自己的心得以抛砖引玉,望各路高手多多指教。    近日浏览Msdn2,有一段很是费解,引于此处:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.

baihaixiao的专栏 3646

.NET垃圾回收的机制解释

首先,对象分为值类型和引用类型,值类型在用完后是由操作系统自动回收的,引用类型由垃圾回收器回收,所以提到垃圾回收肯定是对引用类型来说的。 垃圾回收机制是为了解决内存泄漏问题,即对象在用完后,其占用的内存没有被释放,使一个无用的对象不必要的占用了内存,导致不正常的内存减少甚至耗尽。以前有两种内存管理技术,一种COM开发人员熟悉的引用计数技术,一种C++开发人员熟悉的Delete语句,COM开发人员...

weixin_30625691的博客 219

【译】.Net 垃圾回收机制原理(二)

上一篇文章介绍了.Net 垃圾回收的基本原理和垃圾回收执行Finalize方法的内部机制;这一篇我们看下弱引用对象,代,多线程垃圾回收,大对象处理以及和垃圾回收相关的性能计数器。 让我们从弱引用对象说起,弱引用对象可以减轻大对象带来的内存压力。 弱引用(Weak References) 当程序的根对象指向一个对象时,这个对象是可达的,垃圾回收器不能回收它,这称为对对象的强引用。和强引用相对的...

weixin_33686714的博客 271

.Net的GC垃圾回收机制 为什么要有GC?

C/C++中由程序员进行对象的回收像学校食堂中由学生收盘子,.Net中由GC进行垃圾回收像餐馆中店员去回收。 GC是垃圾收集器(Garbage Collection)。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手工回收,一个例子就是FileStream或者SqlConnection需要程序员调用Disp...

weixin_34220179的博客 477

学习C#开源报表组件Seal Report(24:Seal Report Designer界面布局-20)

学习Seal Report Designer软件左侧面板的Views节点中Tab Control View控件的属性用途及示例

gc_2299的博客 218

python-第20天:关键字参数不定长参数

在学习 Python 的过程中,定义和调用函数是每个开发者的必经之路。你可能已经学会了如何定义一个简单的函数,例如 `def add(a, b): return a + b`。但在实际的项目开发中,为了让代码更具灵活性和可读性,我们需要掌握更高级的参数传递方式。 本篇文章将带你深入浅出地理解 **关键字参数** **不定长参数**,助你编写出更专业、更优雅的 Python 代码。

weixin_42636075的博客 236

Unity C# 脚本学习笔记:命名空间 using

Unity C# 脚本学习笔记:命名空间 using

流云凝荷的博客一个 413

金蝶云星空开发~第三篇:插件篇——C#插件开发事件体系

金蝶云星空开发知识学习

810cheng 299

ODCC 2026年超节点大会演讲资料合集.zip

ODCC 2026年超节点大会演讲资料合集,共16份。1.阿里云磐久超节点互连应用2.超节点高速互联整体解决方案_立讯3.UALink产品研发进展_楠菲微4.通算超节点价值场景的探索创新_华为灵衢5.赋能超节点·智算新纪元——基流科技Venus智算平台6.超节点互联技术发展思考_联通研究院7.阿里云磐久AI Infra AL128超节点服务器架构和产业合作8.智算网络光互联技术演进_腾讯9.面向AI智算的高密光引擎解决方案_海思10.正交超节点整机柜设计_中兴11.大规模AI集群中的以太网_博通12.基于SUE的超节点互联IP和原型组网测试最新进展_合见工软13.超节点协议的需求和挑战,芯粒技术如何加速破局_奇异摩尔14.超算新纪元:百度天池超节点重构AI时代的算力疆域15.超节点管理:支撑大规模GPU计算的运营底座_小红书16.超节点网络创新平台_华为

Java毕业设计后台源码:RFID驱动的高校/单位固定资产登记追踪系统

一套面向本科毕业设计的Java后台系统源码,基于Spring Boot框架开发,集成RFID读写功能,支持资产标签绑定、入库登记、领用归还、位置变更、盘点扫描及状态查询等核心业务流程。项目结构清晰,含完整Maven配置(pom.xml)、标准src/main/javasrc/main/resources目录、测试代码(test)及双语说明文档(README.md/README.en.md),可直接导入IDE运行调试。系统采用B/S架构,后端提供RESTful接口,适配常见RFID硬件设备(如ISO15693/ISO18000-6B协议读卡器),数据库使用MySQL,具备基础权限管理操作日志功能,满足高校实验室、行政单位或中小型企业固定资产管理的实际业务需求。

上一篇: 垃圾回收机制GC知识再总结兼谈如何用好GC
下一篇: C#实现手机发送验证码
devk72522
博客等级 码龄12年 0粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值