zoukankan      html  css  js  c++  java
  • C#之CLR内存深入分析

    C#之CLR内存深入分析

    投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-08-04 我要评论

    这篇文章主要介绍了C#之CLR内存深入分析,对引用类型进行了深入讨论,需要的朋友可以参考下

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

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

    先来装备两个类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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.

    1
    2
    3
    4
    5
    6
    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返回的就说”类型指针对象“所存储的地址。

     
  • 相关阅读:
    Countly在andoid和vps集成使用,开源的统计分析sdk
    简单dp-poj-2231-Moo Volume
    Head First设计模式-观察者模式
    D3D游戏编程系列(六):自己动手编写第一人称射击游戏之第一人称视角的构建
    面试之BI-SQL--table转换[2]
    oracle表数据误删还原
    SQL Server 2008数据库创建,备份,还原图解及注意点
    SHH入门:Spring框架简介
    基于总变差模型的纹理图像中图像主结构的提取方法。
    windows程序员进阶系列:《软件调试》之堆 (一)
  • 原文地址:https://www.cnblogs.com/liyancheng/p/5406584.html
Copyright © 2011-2022 走看看