CLR via C# 笔记

Posted on 2014-08-06 22:33  Wilson_Lin  阅读(126)  评论(0)    收藏  举报

1、从源码到执行CPU指令的过程:

  a、在CLR下编写托管代码,如C#,编写完成后,需要对应的编译器,将源码编译成托管模块,托管模块里面包含的PE头、CLR标识、IL、元数据

  (元数据包含了两个表的内容,一个表为自身定义的类型和字段,一个表为引用的类型和字段,这也是智能感知和垃圾回收机制做是否为垃圾“标识”的依据)

  b、调用到方法时,CLR里的JIT编译器(Just In Time)将IL中间语言,编译为本地CPU指令,这里需注意的是,当再次调用JIT编译后的方法时,不会再去跑编译的损耗,而是直接调用本地CPU指令

2、应用程序开跑后,内存的分配

  a、执行应用程序时,系统开启进程,线程开始跑,提供1M的内存,其中已分配内存给托管堆,栈保存字段,当new一个类型时,托管堆维护的一个指针,会计算出这个实例及其基类字段的大小,分配这个大小的内存,并全部清为0,将类型放在这个托管堆内存上,调用初始化,在返回该对象的地址前,托管堆维护的指针会加上该对象的大小,指向下一个对象的地址

  b、执行到调用方法时,预留一个栈的空间给方法返回,方法内部定义的字段继续在栈下面保存,最终方法返回后,会将方法调用的开始到结束,收缩起来,然后继续走方法之后的内容

3、垃圾回收机制的算法

  a、垃圾回收主要是针对托管堆进行回收

  b、自动垃圾回收触发的机制,当托管堆剩余的内存,不够存储new的这一个对象,这时会触发回收

  c、回收的算法,默认所有的字段都为不引用,然后从栈顶部出发,以根进行引用递归,有引用到的都做上一个“标识”动作,这里面当延伸到已标识的类型时,CLR会自动返回,这是一种提高效率的方法,也是一种避免死循环的做法,到最后,托管堆里的对象分为两种,一种为已标识,一种为未标识,其中未标识的对象为回收的对象,因为这些示标识的对象,是程序无法到达的,这种回收是安全的

(纯属做笔记,帮助自己吸收及记忆,有不对的地方请指出)

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3