当前位置:  编程技术>.net/c#/asp.net

C#之CLR内存深入分析

    来源: 互联网  发布时间:2014-10-31

    本文导语:  本文不再对值类型进行讨论,主要讨论一下引用类型。如要看内存值类型的朋友可以看一下前一篇C#之CLR内存原理初探。 C#引用类型具体分析如下: 先来装备两个类: internal class Employee { public static Employee LookUp(string name) {...

本文不再对值类型进行讨论,主要讨论一下引用类型。如要看内存值类型的朋友可以看一下前一篇C#之CLR内存原理初探。

C#引用类型具体分析如下:

先来装备两个类:

internal class Employee
{
 public static Employee LookUp(string name)
 {
  return null;
 }

 public virtual string GetProgressReport()
 {
  return string.Empty;
 }
}

internal class Manager : Employee
{
 public override string GetProgressReport()
 {
  return string.Empty;
 }
}

Employee类里有一个虚方法GetProgressReport和一个静态方法LookUp,Manager类继承了Employee并重写了GetProgressReport.

static void Main(string[] args)
{
 Employee e = new Manager();
 e = e.LookUp("Tom");
 e.GetProgressReport();
}

 我们在Main里面写上这样的代码,再来对照着下图看看栈和堆是怎么运作的。

 当JIT编译器将这些IL代码转换成本地CPU指令时,会注意到所有的类型:Employee,Manager,String(由于Tom字符串).

1.当运行方法之前,"prologue"代码会为这些对象在内存中开辟空间。

2.Employee e=new Manager();会把e压入栈,然后保存Manager对象地址,我们在初级篇的时候说过,每个对象都有一个同步块索引和类型对象指针,这个指针就是内存的地址。

3.e=Employee.LookUp("Tom");调用一个静态方法时,CLR会定位与定义静态方法的类型对应的类型对象。然后JIT编译器在类型对象的方法表中查找与被调用的方法对应的记录项,对方法进行JIT编译(如果需要的话),再调用JIT编译的代码。这个时候我们知道LoopUp返回的是Employee对象(这时,我们一开始创建的Manager对象还不确认有没有被清除,因为GC会自动去清理这些托管代码),所以在堆上面开辟一个Employee的内存块并把e的地址改变成Employee对象所在的位置。 

注意:Employee和Manager类型对象都包含了“类型指针对象”成员。这时由于类型对象本质上也是对象。CLR创建类型对象时,必须初始化这些成员。初始化成什么呢?CLR开始在一个进程中运行时,会立即为MSCorLib.dll中定义的System.Type类型创建一个特殊的类型对象。Employee和Manager类型对象都是该类型的”实例“。 因此,它们的类型对象指针成员会初始化成对System.Type类型对象的引用。

顺便说一句Object.GetType返回的就说”类型指针对象“所存储的地址。



    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.awt.color类colorspace的类成员方法: type_8clr定义及介绍
  • 求助:各位大哥为什么会出现这样的错误啊(ioctl: LOOP_CLR_FD: 设备或资源忙)谢谢!
  • java命名空间java.awt.color类colorspace的类成员方法: type_2clr定义及介绍
  • sql2005中创建CLR存储过程的方法详解
  • java命名空间java.awt.color类colorspace的类成员方法: type_7clr定义及介绍
  • 在SQL Server 2005中创建CLR存储过程的详细介绍
  • java命名空间java.awt.color类colorspace的类成员方法: type_4clr定义及介绍
  • java命名空间java.awt.color类colorspace的类成员方法: type_5clr定义及介绍
  • java命名空间java.awt.color类colorspace的类成员方法: type_3clr定义及介绍
  • java命名空间java.awt.color类colorspace的类成员方法: type_6clr定义及介绍
  • java命名空间java.awt.color类colorspace的类成员方法: type_9clr定义及介绍
  • java命名空间java.awt.color类icc_profile的类成员方法: icsigspace3clr定义及介绍
  • java命名空间java.awt.color类icc_profile的类成员方法: icsigspace4clr定义及介绍
  • java命名空间java.awt.color类icc_profile的类成员方法: icsigspace5clr定义及介绍
  • java命名空间java.awt.color类icc_profile的类成员方法: icsigspace6clr定义及介绍
  • java命名空间java.awt.color类icc_profile的类成员方法: icsigspace7clr定义及介绍
  • java命名空间java.awt.color类icc_profile的类成员方法: icsigspace8clr定义及介绍
  • java命名空间java.awt.color类icc_profile的类成员方法: icsigspace9clr定义及介绍
  • java命名空间java.awt.color类icc_profile的类成员方法: icsigspace2clr定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3