C#垃圾回收机制的详细介绍

一、托管代码/非托管代码
C#代码通过C#编译器编译成程序集,程序集由微软中间语言组成,CLR会为程序集开辟一个应用程序域,程序集就是运行在这个应用程序域里面的,应用程序域是相互独立的,互不影响。
托管代码:被CLR管理的代码。
非托管代码:不被CLR管理的代码。
分配在栈空间的变量,一旦执行完成其所在的作用域(即大括号范围)就会被CLR回收。
分配在堆里面的对象,当没有任何变量引用它的时候,这个对象就被标记为“垃圾对象”(没有变量引用它),等待垃圾回收器回收。
Eg:


代码如下:

Person p=new Person();
p=null;//p这时候没有指向任何对象空间,此时为“垃圾对象”。

二、GC
GC会定时清理堆里面的垃圾对象,GC的清理频率程序员无法决定,CLR会自动控制。当一个对象标记为垃圾的时候,这个对象不一定会被立即回收。
三、析构函数
1、不能有访问修饰符,不能有参数。
2、在对象被垃圾回收器回收的时候,析构函数被GC自动调用。
3、执行一些清理善后的操作的时候。


代码如下:

class Person
{
  ~Person()
 {
    Console.WrilteLine("我是析构函数");
 }
}

四、代
当堆里面的对象有1W个的时候,GC是不是循环1W次来判断是否为“垃圾对象”,然后对其进行回收呢?答案是否定的,微软根据实际需要采用了很多种算法来清理堆里面的垃圾对象,其中很重要的一种算法就是“代”。堆里面总共有3代,譬如,当程序运行时,有对象需要存储在堆里面,GC就会创建第1代(假设空间大小为256K),对象就会存储在第0代里面,当程序继续运行,运行到第0代的大小不足以存放对象,这时候就就会创建第1代(假设空间为10M),GC就会把第0代里面的“垃圾对象”清理掉,把“活着”的对象放在第1代,这时候第0代就空了,用于存放新来的对象,当第0代满了的时候,就会继续执行以上操作,随着程序的运行,第1代不能满足存放要求,这时候就会创建第2代,清理方式如上相同。下图用于理解以上描述的过程:

GC.GetGeneration(P)得到指定的对象对应的代,总共有三代。
GC.Collect();//让垃圾回收器对所有的代进行回收。

GC.Collect(1)//回收第0代和第1代回收。

代码如下:

class Program
    {
        ~Program()
        {
            Console.WriteLine("我是析构函数");
        }
        static void Main(string[] args)
        {
            Program p1 = new Program();
            Console.WriteLine("p对象所在的代:" + GC.GetGeneration(p1));//处在第0代
            GC.Collect();//所有代清除了,包括第0代,这时候存活的对象就存在在第1代了。
            Console.WriteLine("p对象所在的代:" + GC.GetGeneration(p1));
            GC.Collect();//所有代清除了,包括第0代第1代,这时候存活的对象就存在在第2代了。
            Console.WriteLine("p对象所在的代:" + GC.GetGeneration(p1));
            GC.Collect();//最多只有3代
            Console.WriteLine("p对象所在的代:" + GC.GetGeneration(p1));
            p1 = null;//p这时候在第2代了         
            GC.Collect(2);//这时候p1就被回收掉了。
            Console.ReadKey();
        }
    }

结果:

(0)

相关推荐

  • JVM的垃圾回收机制详解和调优

    文章来源:matrix.org.cn 作者:ginger547 1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作. 在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能.有些垃圾收集专用于特殊的应用程序.比如,实时应用程序主要是为了避免垃圾收集中断,而大多数OLTP应用程序则注重整体效率.理解了应用程序的工作负荷

  • JavaScript 垃圾回收机制分析

    在公司经常会听到大牛们讨论时说道内存泄露神马的,每每都惊羡不已,最近精力主要用在了Web 开发上,读了一下<JavaScript高级程序设计>(书名很唬人,实际作者写的特别好,由浅入深)了解了一下JavaScript垃圾回收机制,对内存泄露有了一定的认识. 和C#.Java一样JavaScript有自动垃圾回收机制,也就是说执行环境会负责管理代码执行过程中使用的内存,在开发过程中就无需考虑内存分配及无用内存的回收问题了.JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其

  • 深入java垃圾回收的详解

    1.垃圾收集算法的核心思想Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象.该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用. 垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配.垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能,因

  • Flex 编程注意之性能优化、垃圾回收的一些总结

    以下的内容是某个QQ群中得到的,我经过了一些整理和补充,希望对大家有所帮助. 注意:以下内容不是我原创的,请勿擅自转载,本文只是用作记录和总结.:) 垃圾回收的一些知识总结: 1.被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉. 2.父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除. 3.如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null. 4.本对象删除

  • 浅谈关于C#的垃圾回收机制

    理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理.程序集加载.安全性.异步处理和线程同步. CTS(Common Type System)通用类型系统,它把.Net中的类型分为2大类,引用类型与值类型..Net中所有类型都间接或直接派生至System.Object类型.所有的值类型都是System.ValueType的子类,而System.ValueType本身却是引用类型.

  • 理解Python垃圾回收机制

    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class ClassA(): def __init__(self): print 'object born,id:%s'%str(hex(id(self))) def __del__(self): pr

  • Python的垃圾回收机制深入分析

    一.概述: Python的GC模块主要运用了"引用计数"(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过"标记-清除"(mark and sweep)解决容器对象可能产生的循环引用的问题.通过"分代回收"(generation collection)以空间换取时间来进一步提高垃圾回收的效率. 二.引用计数 在Python中,大多数对象的生命周期都是通过对象的引用计数来管理的.从广义上来讲,引用计数也是一种垃

  • PHP垃圾回收机制简单说明

    虽然自己也是PHP的学习者,但之前还真没怎么了解PHP内部的垃圾回收流程,只是在我们的代码中用了unset,null,mysql_close,__destruct等等一些函数去释放对象防止内存溢出而已,所以上网GG下,找到了以下一些说明,作下记录"PHP可以自动进行内存管理,清除不再需要的对象.PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制.每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1.当r

  • C#垃圾回收机制的详细介绍

    一.托管代码/非托管代码C#代码通过C#编译器编译成程序集,程序集由微软中间语言组成,CLR会为程序集开辟一个应用程序域,程序集就是运行在这个应用程序域里面的,应用程序域是相互独立的,互不影响.托管代码:被CLR管理的代码.非托管代码:不被CLR管理的代码.分配在栈空间的变量,一旦执行完成其所在的作用域(即大括号范围)就会被CLR回收.分配在堆里面的对象,当没有任何变量引用它的时候,这个对象就被标记为"垃圾对象"(没有变量引用它),等待垃圾回收器回收.Eg: 复制代码 代码如下: Pe

  • 基于java中stack与heap的区别,java中的垃圾回收机制的相关介绍

    #. 在java中有两类内存.分别称为stack(堆栈)和heap(堆). stack是程序内存空间,因此所有的基本类型和对象的引用是存在stack中. heap是java虚拟机储存对象的,它是一个巨大的内存,当你创造一个对象,java虚拟机把对象放入heap中,把创造的对象的地址放入stack中. 因此,基本类型.对象的引用储存在stack中:对象储存在heap中. #. java中的垃圾回收机制 当你new一个新的对象,java分配必需的内存.当你用完一个对象时,java的垃圾回收器为你把内

  • 详细分析Python垃圾回收机制

    引入 为什么要有垃圾回收机制 Python中的垃圾回收机制简称(GC),我们在程序的运行中会产生大量的变量用于保存数据,而有时候有些变量已经没有用了就需要被清理释放掉该变量所占据的内存空间.在一些较为低级的语言中(比如:C语言,汇编语言)对于内存空间的释放是需要编程人员来手动进行的,这种与底层硬件直接打交道的操作是十分的危险与繁琐的,而基于C语言开发而来的Python为了解决掉这种顾虑则自带了一种垃圾回收机制,从而让开发人员不必过分担心内存的使用情况而可以全身心的投入到开发中去. >>>

  • 快速了解JAVA垃圾回收机制

    说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为"垃圾"?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题.以下是本文的目录大纲: 如果有不正之处,希望谅解和批评指

  • Java垃圾回收机制简述

    说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理. 顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为"垃圾"?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题.以下是本文的目录大纲: 如何确定某个对象是"

  • 如何快速理解python的垃圾回收机制

    一.先来说说为什么要有垃圾回收 解释器在执行到定义变量得语法时,会申请内存空间来存放变量得值,但是由于内存空间是有限得,所以这就涉及到了内存回收问题了,当一个变量值没有用了(简称垃圾),这种时候就应该回收掉这个变量值得内存空间. 二.那么什么是垃圾回收机制 垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间 三.为什么要用垃圾回收机制呢? 程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),

  • 谈谈JavaScript中的垃圾回收机制

    JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存. 在编写 JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理. 这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间), 周期性地执行这一操作. 具体到浏览器中的实现,则通常有两个策略,分别为标记清除和引用计数. 一.标记清除 JavaScri

  • 谈谈python垃圾回收机制

    什么是垃圾回收机制? 首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来. 在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾.那当你有了女朋友了就不一样了,她会帮你收拾房间,把没用的垃圾都给你扔掉. 那在我们Python当中的垃圾回收承担的就是女朋友的角色,你们想象一下,你现在有一个轻度强迫症的女朋友一刻不停的跟在你的背后打扫卫生,你一放下脏碟子或者垃圾什么的,就已经帮你清理.打扫了 所以垃圾回收机制就是自动帮助我们管理内

  • 详解php内存管理机制与垃圾回收机制

    一.内存管理机制 先看一段代码: <?php //内存管理机制 var_dump(memory_get_usage());//获取内存方法,加上true返回实际内存,不加则返回表现内存 $a = "laruence"; var_dump(memory_get_usage()); unset($a); var_dump(memory_get_usage()); //输出(在我的个人电脑上, 可能会因为系统,PHP版本,载入的扩展不同而不同): //int 240552 //int

  • 分析PHP的垃圾回收机制

    如果用过C语言,那么申请内存的方式是malloc或者是calloc,然后你用完这个内存后,一定不要忘了用free函数去释放掉,这就是传说中手动垃圾回收,一般都是扫地神僧用这种方式.很多高层次语言中,你这辈子都是接触不到内存管理的,比如世界上最好的语言php,这种语言替你管理了内存,你就安安心心写烂代码即可.写php的,你说你关心内存,我是不怎么相信的,一定是你在装逼.当然了,如果你用的swoole或者wm或者自己发明的常驻内存级php应用,那你将不得不关注内存泄露问题,也就说一定要记得释放无用变

随机推荐