对于这篇,不想再对值类型进行讨论,如要看值类型的内存怎么玩可以看一下(CLR内存那点事 初级),我们这篇主要讨论一下引用类型。

先来装备两个类

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

【C#】CLR内存那点事(高级)的更多相关文章

  1. 【C#】CLR内存那点事(string)

    string是比特殊的类,说引用类型,但不存在堆里面,而且String str=new String("HelloWorld")这样的重装也说没有的. 我们先来看一个方法 clas ...

  2. 【C#】CLR内存那点事(初级)

    最近回头看了一下书,对内存的理解又有新的认识.我所关注的内存里面说没有寄存器的,所以我关注的只有 托管堆(heap),栈(stack), 字符串常量池(string是一个很特殊的对象) 首先我们看两个 ...

  3. 【C语言探索之旅】 第一部分第四课第一章:变量的世界之内存那档事

    内容简介 1.课程大纲 2.第一部分第四课第一章:变量的世界之内存那档事 3.第一部分第四课第二章预告:变量的世界之声明变量 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答 ...

  4. 程序计数器(关于java虚拟机内存的那些事)

    <深入理解java虚拟机> 读书感悟 作者:淮左白衣 --------------写于2018年4月9日17:44:48 关于java虚拟机内存的那些事之程序计数器 关于java虚拟机内存 ...

  5. CPU与内存的那些事

    下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...

  6. 转:CPU与内存的那些事

    下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...

  7. 【转】CPU与内存的那些事

    下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...

  8. JVM 内存的那些事

    转自:http://blog.jobbole.com/104863/ 对于Java程序员你来说,在虚拟机内存管理的帮助下,不需要为每个new对象都匹配free操作,内存泄露和内存溢出等问题也不太容易出 ...

  9. CLR内存管理

    CLR管理内存的区域,主要有三块,分别为: 1.线程的堆栈:(在程序应该编译过程为值类型实例分配好内存) 用于分配值类型实例.堆栈主要由操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时 ...

随机推荐

  1. 在android开发中添加外挂字体

    1.在项目目录中,右键app——New——Folder—— Assets Folder 2.把.ttf或者.oft文件拷进这个assets文件夹 3.在onCreate()中 Typeface typ ...

  2. Dell PowerEdge R720内存安装原则

    Dell PowerEdge R720内存安装原则   摘要:系 统包含 24 个内存插槽,分为两组(每组 12 个),每个处理器一组.每组的 12 个插槽分入四个通道.在每个通道中,第一个插槽的释放 ...

  3. mysql 常见参数

    my.cnf[client] 对mysql的所有客端都生效的[mysql] 只对mysql这个命令有效了[mysqd][mysqld_multi] 多实例启动[mysqld_safe][mysqldN ...

  4. 第七章 JVM体系结构与工作方式

    JVM能跨计算机体系结构来执行Java字节码,主要是由于JVM屏蔽了与各个计算机平台的软件和硬件之间的差异. 7.1 JVM体系结构 7.1.1 何谓JVM 模拟一个计算机来达到一个计算机所具有的计算 ...

  5. SQL语句替换字段内容例子

    SELECT REPLACE(SysFuncID,'7201','7204') ,           CASE           WHEN Flag=1 THEN REPLACE(funcname ...

  6. Linux - 创建用户的相关文件

    创建一个用户会与 6 个文件相关 /etc/passwd 储存了所有用户的相关信息 第一行中,从左往右 root 为用户名,: 为分隔符,x 为密码,0 为 uid,0 为 gid,root 为用户的 ...

  7. 3.solr学习速成之索引添加 查询 删除

    solrserver.java public class solrServer { private solrServer(){}; final static String SOLR_URL = &qu ...

  8. 常用Linux命令-文件上传和下载

    rz 上传本地文件到远程服务器 sz fileName 下载文件到本地电脑 如果不能使用以上命令进行文件上传和下载需要安装命令,步骤如下: 1.软件安装1)编译安装root 账号登陆后,依次执行以下命 ...

  9. CString,string和char*

    CString是MFC中的 标准C中没有string,有string.h头文件,其中是strcpy,strcmp等函数.但操作对象都是char*类型 string是C++中封装的 转化:LPCSTR  ...

  10. Tornado 接口的实现