C#基础:.NET中GC的运行机制

一、什么是GC

GC是垃圾回收(Garbage Collector)的缩写。GC可以说是.NET众多机制中最为重要的,对程序员代码书写方式影响最大的机制。在CLR规范制定之初,所有机制都还在斟酌的时候,垃圾回收已经被确定会存在于.NET框架之中。

.NET的程序大部分被称为被托管的代码。托管的意义很广泛,其中重要的一点就是代码中对象内存的分配和释放是由.NET内存管理和垃圾回收机制统一管理的。和传统C++的程序员不同,C#或者其他面向.NET框架语言的程序员不再需要时刻警惕内存的泄露,因为托管对象的内存最终会被垃圾回收释放掉,尽管不同的编写方式会产生不同的运行效率。

这里指的是受托管的对象,当使用了一些非托管的资源时,程序员仍然需要手动地释放它们。

所谓的垃圾回收,是指.NET清理托管堆上不会再被使用的对象内存,并且移动仍在被使用的对象,使它们紧靠托管堆的一边。下图展示了一次垃圾回收后托管堆上的变化。

如上图所示,GC的执行过程分为两个基本动作:

  1. 找到所有不再被使用的对象:对象A和对象C,并标记为垃圾。
  2. 移动扔在被使用的对象:对象B和对象D。这样对象A和对象C的内存空间就被腾空出来了,以备下次分配的时候使用。

这里简化了GC的执行过程,省略了包含Finalize方法对象的处理,以及大对象分配的特殊性。

垃圾回收由.NET垃圾回收机制来控制,理论上当托管堆内存不够时,.NET会运行垃圾回收来得到更多的可分配内存,微软并没有公开这一部分的算法,程序员无法精确得知垃圾回收的执行时间。在通常情况下,程序员不需要干涉垃圾回收的执行。不过CLR仍然提供了一个手动执行垃圾回收的方法:GC.Collect()方法。当程序员需要在某一批对象不再使用并且及时释放内存时,可以调用该方法来实现。

垃圾回收涉及了对象块的移动、遍历找到不被使用的对象,这是一个相当耗费资源的过程。所有的程序优化策略都会有一条:尽量减少垃圾回收的负担和次数。在编写程序的过程中,应该注意避免不必要的资源分配,因为这意味着多余的垃圾回收的负担。

二、总结

垃圾回收是指收集释放托管堆上不再被使用的内存对象。其过程基本包括:通过算法找到不再被使用的对象、移动对象使所有扔被使用的对象紧靠托管堆的一边和调整各个状态变量。

垃圾回收的运行成本较高,对性能的影响较大。程序员在编写.NET代码时,应该避免不必要的内存分配,尽量减少或避免使用GC.Collect来执行垃圾回收。

原文地址:https://www.cnblogs.com/dotnet261010/p/12330503.html

时间: 2024-10-09 13:00:51

C#基础:.NET中GC的运行机制的相关文章

OFBiz中JOB的运行机制

OFBiz执行后台任务的类在org.ofbiz.service.job中.JobPoller和JobInvoker是主要的两个类,一个负责查询可以执行的Job,另一个执行Job任务.Job类图如下所示.1.Job轮询 创建JobManager时,会创建JobPoller的一个实例.JobPoller实现了Runnable接口,以此创建线程后 通过JobManager一直轮询是否有Job需要执行,如果有奖将其放入队列中. 1     public synchronized void run() {

搜集整理java中GC的理解

Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间. 需要注意的是:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身: System.gc() Runtime.getRuntime().gc() 上面的方法调用时用于显式通知JVM可以进行一次垃圾回收,但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不 可预料的 ===================================================

java基础---JVM内存管理以及内存运行机制学习总结

自己从网上搜资料拼接了一张JVM内存图:如下图所示: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的 方式去实 现),字节码解释器工作时就是通过改

Asp.Net中的GC(垃圾回收机制)

1.群里讨论中扯出来点,先记录下来关于GC的一些认识 建立一个测试项目. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GC_Test { class Program { static void Main(string[] args) { //托管代码.被CLR管理的代码 //非托管代码.不被

【《Objective-C基础教程 》笔记ch04】(五)OC中的继承inheritance机制

一.为什么需要继承 使用继承一方面继承了父类的特性,另一方便解决了重复代码维护问题. 二.继承之语法 1. @interface 子类名:父类名 2. OC只支持单继承,不支持继承多个父类. 3. 重构--移植和优化代码. 三. 继承的工作机制 1. 方法调度 子类拥有一个指向它父类的引用指针,消息传递时,OC的方法调度机制使用该信息来找到正确的实现方法,查找过程是现在子类中找,找不到再到父类中继续找. 2. 实例变量 1)继承实例源码 @interface Shape : NSObject {

Java基础8-浅谈java程序的运行机制与JVM运行

一.java程序的运行机制 Java开发的整个生命周期,可以概括为两个阶段:编译阶段和运行阶段. 1.编译阶段 ①程序员编写一个符合java语法的xx.java的源文件. ②使用javac.exe命令对以上的java源程序进行编译. ③若编译通过则生成一个xxx.class文件. 2.运行阶段 ①打开命令窗口,在命令窗口中使用java.exe命令运行java程序. 二.java虚拟机运行 如上图所示,java文件解释执行时会启动JVM(java虚拟机)来给程序划分内存区域并转换成计算机系统可以识

java学习-----jvm的内存分配及运行机制

VM运行时数据区域: 根据<Java虚拟机规范(第二版)>的规定,JVM包括下列几个运行时区域: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的

GC垃圾回收机制

个人理解: 因为在使用JAVA创建一个类或者对象后,难免会存在以后不使用的情况,为了减少其继续再占用内存,必须建立一套清理垃圾的机制,但是怎么判断什么样的才算是不使用的垃圾呢,这里面进行了判断并标记分类,然后根据不同的标记再进行不同的处理.不过世事无完美之说,其也是存在弊端的(开销通常很大,而且它的运行具有不确定性),为了避免,我们还是在正常工作中,养成一个好的编程习惯.详情参照https://www.cnblogs.com/jeffwongishandsome/p/talk-about-GC-

面试官,不要再问我“Java GC垃圾回收机制”了

Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解>中有些内容我们没有讲,本篇结合垃圾回收机制来一起学习.还记得JVM中堆的结构图吗? 图中展示了堆中三个区域:Eden.From Survivor.To Survivor.从图中可以也可以看到它们的大小比例,准确来说是:8:1:1.为什么要这样设计呢,本篇文章后续会给出解答,还是根据垃圾回收的具体情况来设计的.