一、托管代码/非托管代码

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();//这时候p1就被回收掉了。
Console.ReadKey();
}
}

结果:

注:以上文章均属软谋原创,如需转载请注明出处!

C#垃圾回收机制详解的更多相关文章

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

    JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...

  2. PHP的垃圾回收机制详解

    原文:PHP的垃圾回收机制详解 最近由于使用php编写了一个脚本,模拟实现了一个守护进程,因此需要深入理解php中的垃圾回收机制.本文参考了PHP手册. 在理解PHP垃圾回收机制(GC)之前,先了解一 ...

  3. java面试题之----JVM架构和GC垃圾回收机制详解

    JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...

  4. GC垃圾回收机制详解

    JVM堆相关知识    为什么先说JVM堆?  JVM的堆是Java对象的活动空间,程序中的类的对象从中分配空间,其存储着正在运行着的应用程序用到的所有对象.这些对象的建立方式就是那些new一类的操作 ...

  5. Python垃圾回收机制详解

    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #e ...

  6. JVM的内存区域划分以及垃圾回收机制详解

    在我们写Java代码时,大部分情况下是不用关心你New的对象是否被释放掉,或者什么时候被释放掉.因为JVM中有垃圾自动回收机制.在之前的博客中我们聊过Objective-C中的MRC(手动引用计数)以 ...

  7. php5.3新垃圾回收机制详解

    php的垃圾回收机制主要参考了http://blog.csdn.net/phpkernel/article/details/5734743 这文章. 变量对应的值,比如 $a="abc&qu ...

  8. Python垃圾回收机制详解转自--Kevin Lu

    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #e ...

  9. PHP 垃圾回收机制详解

    前言:之前对PHP的GC只是了解了个大概,这次详细了解下PHP的垃圾回收机制(GC). 介于网上大部分都是PHP5.X的GC,虽然 php5 到 php7 GC部分做出的改动较小,但我觉得还是一起写下 ...

  10. Java垃圾回收机制详解和调优

    gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集 ...

随机推荐

  1. C# #if DEBUG

    首先,大小写不能写错,其次,解决方案配置设为:Debug,才会执行该语句,如果在条件里面搭配Debug.Assert等,效果甚佳.而如果要设置为Release模式,就不会执行条件语句中的内容,有时候可 ...

  2. cannot find the word template:WordToRqm.dot的解决方法

    powerdesigner安装后: C:"Program Files"Sybase"PowerDesigner 12"Add-ins"Microsof ...

  3. (转载)四种常见的 POST 提交数据方式

    (转载)http://www.imququ.com/post/four-ways-to-post-data-in-http.html HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS ...

  4. Android增量更新

    http://blog.csdn.net/tu_bingbing/article/details/8538592 (转)

  5. git 实用命令

    git 覆盖本地修改 ,git 放弃本地修改,强制更新 git fetch --all git reset --hard origin/master git fetch 只是下载远程的库的内容,不做任 ...

  6. 【HTML】Advanced6:HTML5 Forms Pt. 1: Input Types

    1.Not yet work fully on all major browsers 2.<input type="search tel url email datetime date ...

  7. 【Java基础】static关键字的理解

    修饰范围: 可以修饰成员变量和成员方法.静态的特点: A:随着类的加载而加载 B:优先于对象存在 C:被类的所有对象共享 这其实也是我们判断该不该使用静态的依据. 举例:饮水机和水杯的问题思考可通过类 ...

  8. 【原创】关于hashcode和equals的不同实现对HashMap和HashSet集合类的影响的探究

    这篇文章做了一个很好的测试:http://blog.csdn.net/afgasdg/article/details/6889383,判断往HashSet(不允许元素重复)里塞对象时,是如何判定set ...

  9. HW4.43

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  10. mybatis的$存在安全问题,为什么又不得不用?

    1.mybatis的官网关于$和#的字符串替换符号区别描述如下: http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Parameters 上面的意 ...