C# 托管堆和垃圾回收器GC

这里我们讨论的两个东西:托管堆和垃圾回收器,前者是负责创建对象并控制这些对象的生存周期,后者负责回收这些对象。

一、托管堆分配资源

CLR要求所有的对象都从托管堆分配。进程初始化时,CLR划出一个地址空间区域作为托管堆。CLR还要维护一个指针P,该指针指向下一个对象在堆中的分配位置。

那么我们进一步深入看看创建一个对象(也就是new 一个对象)时CLR做了哪些工作呢。

1、计算类型字段需要的字节数。

2、加上对象开销所需要的字节数,每个对象都有两个开销:类型对象指针和同步块索引

3、CLR检查区域中可用空间够不够,如果够就在指针P指向的地址放入对象。

4、调用类型的构造器,new操作符返回对象引用。

5、返回对象引用之前指针P会移到下个对象放入托管堆时的地址。

二、垃圾回收器回收资源

应用程序调用new操作符创建对象时,可能没有足够的地址空间来分配该对象,发现空间不够,CLR就执行回收.

在讲GC时我们要明白几个概念:

  根:将所有引用类型的变量都称为根

可达和不可达:至少有一个根在引用对象时我们称这个对象可达,否则我们称之为不可达。

正式开始垃圾回收,我们参考上面的这个图,图中A,B、C、D、E就是我们托管堆上的对象,现在只有A和C两个对象被引用,E被C引用,步骤如下:

1、CLR开始GC时,前先暂停进程中的所有线程。

2、CLR遍历堆中的所有对象,将所有对象都标记为0,表示所有对象都应删除。

3、CLR检测所有活动根,任何根如果引用了堆上的对象CLR就会标记那个对象为1.注意这里的C引用了E,在标记C的时候还要判断E是否标识了1,如果标记了就不再标记,如果没有标记则标记为1

4、标记完后堆中的对象要么是已标记1,要么是未标记0,已标记的对象为可达的,未标记的对象为不可达的,GC会接下来会删除这些未标记的对象,也就是标记为0的对象

5、GC将对象删除后进入压缩阶段,将所有对象集中在一个连续的类存中,解决了本机的空间碎片化的问题,压缩完成后,CLR恢复应用程序的所有线程。

至此,一个对象的创建到回收就完成了。

原文地址:https://www.cnblogs.com/zhengwei-cq/p/8474574.html

时间: 2024-08-24 21:31:44

C# 托管堆和垃圾回收器GC的相关文章

【C#进阶系列】20 托管堆和垃圾回收

托管堆基础 一般创建一个对象就是通过调用IL指令newobj分配内存,然后初始化内存,也就是实例构造器时做这个事. 然后在使用完对象后,摧毁资源的状态以进行清理,然后由垃圾回收器来释放内存. 托管堆除了能避免错误使用已经被释放的内存,也会减少内存泄漏,大多数类型都无需资源清理,垃圾回收器会自动释放资源. 当然也有需要立即清理的,比如一些包含了本机资源的类型(如文件.套接字和数据库连接等),可在这些类中调用一个Dispose方法.(当然有的类对这个方法封装了一下,可能是别的名字比如断开数据库连接的

CLR via C#-托管堆和垃圾回收

托管堆基础 访问类型的资源 面向对象的环境中,每个类型都代表可供程序使用的一种资源.要使用这些资源,必须为代表资源的类型分配内存.以下是访问一个资源所需的步骤. ①调用IL指令newobj,为代表资源的类型分配内存,由new操作符来完成. ②初始化内存,设置资源的初始状态并使资源可用,类型的实例构造器负责设置初始状态. ③访问类型的成员来使用资源. ④摧毁资源的状态以进行清理. ⑤释放内存,垃圾回收器独自负责这一步. 托管堆为开发人员提供了一个简化的编程模型,分配并初始化资源并直接使用. 大多数

重温CLR(十五) 托管堆和垃圾回收

本章要讨论托管应用程序如何构造新对象,托管堆如何控制这些对象的生存期,以及如何回收这些对象的内存.简单地说,本章要解释clr中的垃圾回收期是如何工作的,还要解释相关的性能问题.另外,本章讨论了如何设计应用程序来最有效地使用内存. 托管堆基础 每个程序都要使用这样或那样的资源,包括文件.内存缓冲区.屏幕空间.网络连接.数据库资源等.事实上,在面向对象的环境中,每个类型都代表可提供程序使用的一种资源.要使用这些资源,必须为代表资源的类型分配内存.以下是访问一个资源所需的步骤 1 调用IL指令newo

.NET 托管堆和垃圾回收

托管堆基础 简述:每个程序都要使用这样或那样的资源,包括文件.内存缓冲区.屏幕空间.网络连接.....事实上,在面向对象的环境中,每个类型都代表可供程序使用的一种资源.要使用这些资源,必须为代表资源的类型分配内存.以下是访问一个资源所需步骤:1.调用IL指令newobj,为代表资源的类型分配内存.(C# new操作符)2.初始化内存,设置资源的初始状态.(一般指构造函数)3.访问类型的成员来使用资源.(使用成员变量.方法.属性等)4.摧毁资源的状态以进行清除.(???Dispose???)5.释

垃圾回收器GC

java中的垃圾回收机制 JAVA 的一个重要特点就是有垃圾回收器,并且能够自动回收垃圾,这也是java相对与其他语言的有优势的地方,如C语言就没有自动回收垃圾的机制. java的每一个实例对象和数组都是在对堆里面分配空间的,解释器具有为类实例分配空间的工作能力,在解释器为一个实例分配完存储空间时,就会记录该实例对象所占用的内存区域的使用,一旦对象使用完毕之后,就会被回收到垃圾中! 在java语言中,出来new语句外没有其他方法为一个对象申请和释放内存,对内存的释放和回收的工作是有java运行系

Java GC系列(3):垃圾回收器种类

本文由 ImportNew - 好好先生 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这篇教程中我们将学习几种现有的垃圾回收器.在Java中,垃圾回收是一个自动的进程可以替代程序员进行内存的分配与回收这些复杂的工作.这篇是垃圾回 收教程系列的第三篇,在前面的第2部分我们看到了在Java中垃圾回收是如何工作的,那是篇有意思的文章,我推荐你去看一下.第一部分介绍了Java的垃 圾回收,主要有JVM体系结构,堆内存模型和一些Java

[Java基础]-- Java GC 垃圾回收器的分类和优缺点

https://blog.csdn.net/high2011/article/details/80177473?utm_source=blogxgwz2 所属专栏: Java 版权声明:尊重原创,转载请标明,本文转自 https://blog.csdn.net/high2011/article/details/80177473 关于Java的垃圾回收器,一直是个头疼的问题,这里简要说明下分类和优缺点,供选择使用. 一.JVM GC 垃圾回收器类型 JVM的垃圾回收器大致分为六种类型: 1.串行:

Java GC 垃圾回收器的类型小结

阅读了java paper的垃圾回收器类型文章,在此做一个小结,文章部分翻译自java paper gc collector,部分自己做的总结,图片来自网络,在此仅用作理解表达之用. 一.JVM GC 垃圾回收器类型 JVM的垃圾回收器大致分为四种类型: (图片来自网络) 1.串行垃圾回收器  Serial Garbage Collector 串行垃圾回收器在进行垃圾回收时,它会持有所有应用程序的线程,冻结所有应用程序线程,使用单个垃圾回收线程来进行垃圾回收工作. 串行垃圾回收器是为单线程环境而

JVM 垃圾回收器工作原理及使用实例介绍(转载自IBM),直接复制粘贴,需要原文戳链接

原文 https://www.ibm.com/developerworks/cn/java/j-lo-JVMGarbageCollection/ 再插一个关于线程和进程上下文,待判断 http://blog.sina.com.cn/s/blog_75e9551f01016cm3.html 垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担. 拥有垃圾收集