简介

记录c#对象在托管堆中运行时的相互关系,如下记录了一个方法在执行时候的生命周期,当方法在之前,CLR会先执行将方法里面所有用到的局部变量、参数对应的内存地址等全部存放当前线程栈当中,并且会将所有实例字段设为null或者0,new操作之后才会返回对象的内存地址,。

线程栈

1.CRL在运行的时候会启动一个进程,该进程包含多个线程,线程在进行创建的时候会分配到1MB的栈,栈空间用于向方法传递实参,方法内部定义的局部变量也在栈上。

2.最简单的方法包含初始化代码,在方法开始工作前进行初始化,还包含结束代码,在方法工作后对其进行清理,下图展示了M1方法开始执行的时候,它的初始化代码在线程栈上分配局部变量name的内存,并且会在堆中为name开辟一块内存用来存储name

3.然后执行M2方法,将局部变量name作为实参传递,这里传递的其实是一个引用的地址也就是name变量所在内存中的位置,并且也会将返回地址也存到栈中,被调用的方法在结束之后,应该返回的位置,如下图所示:

4.当方法M2开始执行时,他的初始化代码在线程栈中为局部变量len和count分配内存,当M2方法内部代码执行完成之后,M2开始执行Return语句,造成CPU的指令指针被设置成栈中的返回地址,最终M1也会返回到它的调用者:

类存储

假如现在存在一个类的定义,name现在基于这个类来进行讨论:

public class User{
int age=;
string name="zyz";
public string getUserName(){...} }

当window已经启动,CLR以加载到其中,并且托管堆也已初始化,c#编译器会把C#代码编译成IL(中间语言)并且由CLR当中的JIT把IL代码转换成本机cpu指令, JIT在编译的时候会生成。

在执行的时候M3内部引用的所有类型会注意到包括user,int,string类型,这时CLR要确定定义了这些类型的所有程序及都已经加载,然后利用程序集提取与这些类型相关的信息,创建一些数据结构来表示类型本身。如下图所示:

当CLR确认方法当中所有类型都已经创建,M3代码编译之后就允许线程执行M3的代码,M3的构造函数执行时必须在线程栈中为局部变量分配内存,

当实例化User的时候,将会在托管堆中创建user类型的一个实例,并且该实例也有类型对象指针和同步块索引,该对象还包含了必要的字节来容纳user类型定义的所有数据字段(age,name),以及容纳由user的任何积累(本例只有Object,所有对象都继承system.object)定义的所有字段,任何时候在堆上新建对象,CLR都自动初始化内部的类型对象指针成员来引用和对象对应的类型对象。

当调用M3方法当中进行调用getUserName的时候,会对方法进行JIT编译,在调用JIT编译好的代码。

如有理解有误的地方,还请给与指正!~

C# 运行时的关系的更多相关文章

  1. .NET中 类型,对象,线程栈,托管堆在运行时的关系

    .NET中 类型,对象,线程栈,托管堆在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and T ...

  2. [读书心得] .NET中 类型,对象,线程栈,托管堆在运行时的关系

    .NET中 类型,对象,线程栈,托管堆 在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and ...

  3. 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法(第二次修改)

    1.线程栈 window的一个进程加载clr.该进程可能含有多个线程,线程创建的时候会分配1MB的栈空间. 如图: void Method() { string name="zhangsan ...

  4. C# 类型、对象、线程栈和托管堆在运行时的关系

    我们将讨论类型.对象.线程栈和托管堆在运行时的相互关系,假定有以下两个类定义: internal class Employee    {        public int GetYearsEmplo ...

  5. .Net 类型、对象、线程栈、托管堆运行时的相互关系

    JIT(just in time)编译器 接下来的会讲到方法的调用,这里先讲下JIT编译器.以CLR书中的代码为例(手打...).以Main方法为例: static void Main(){ Cons ...

  6. C# (类型、对象、线程栈和托管堆)在运行时的相互关系

    在介绍运行时的关系之前,先从一些计算机基础只是入手,如下图: 该图展示了已加载CLR的一个windows进程,该进程可能有多个线程,线程创建时会分配到1MB的栈空间.栈空间用于向方法传递实参,方法定义 ...

  7. 【.Net基础一】 类型、对象、线程栈、托管堆运行时的相互关系

    目前在看CLR via C#,把总结的记下来,索性就把他写成一个系列吧. 1.[.Net基础一] 类型.对象.线程栈.托管堆运行时的相互关系 2.[.Net基础二]浅谈引用类型.值类型和装箱.拆箱 J ...

  8. Android ART运行时无缝替换Dalvik虚拟机的过程分析

    Android ART运行时无缝替换Dalvik虚拟机的过程分析 分类: Android2014-01-13 00:59 42722人阅读 评论(66) 收藏 举报 AndroidARTDalvikV ...

  9. 【VS开发】MFC运行时库与debug、release版本之间的配置关系

    参考内容: 前段时间从网上下来一个有意思的代码,用VS2010打开时需要将工程转换为2010的工程,转化后却出现了编译不通过的问题,类似这样的错误:c:\program files\microsoft ...

随机推荐

  1. Javascript 的定时器 setInterval,setTimeout,clearInterval

    今天开通博客.来1个.哇哈哈哈~~ 今天本来想复习BOM的看到定时器也算DOM一种 ?(是这样吗).分享一下 参考源于:八神吻你 http://www.cnblogs.com/lmfeng/archi ...

  2. JS基础语法---(数据)简单类型和复杂类型

    原始数据类型: number, string, boolean, undefined, null, object 基本类型(简单类型), 即值类型: number, string, boolean 复 ...

  3. Vue组件通信的几种方法

    上一节说到,vue.js是允许子组件通过props接受父组件的信息,但是不允许父组件通过props接受子组件的信息 1. $emit()和on 当子组件需要向父组件传递数据时,就要用到自定义事件. 使 ...

  4. eNSP仿真模拟软件之理解Hybrid接口的应用

    1. 实验原理 Hybrid接口既可以连接普通终端的接入链路又可以连接交换机间的干道链路,它允许多个VLAN的帧通过,并可以在出接口方向将某些VLAN帧的标签剥掉. Hybrid接口处理VLAN帧的过 ...

  5. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222。

    方法一: var num = ""; var nums = []; var a = Number(prompt());//所要拼接的数字 var b = Number(prompt ...

  6. day89_11_11Flask启动,配置,路由,fbv和cbv

    一.flask的形成. flask是一个基于python并且以来jinja2模板和werkzeug wsgi服务器的一个微型框架. 安装了flask模块就代表安装了wekzeug,所以先安装flask ...

  7. ajax给全局变量设置值,请先关掉异步上传效果

    $.ajax({ type: 'POST', url: "/downloadExcelInfo", timeout: 0, async: false, contentType: & ...

  8. MQ的幂等性和解决方案

    1.幂等性 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.通俗的讲就一个数据,或者一个请求,给你重复来多次,你得确保对应的数据是不会改变的,不能出错:类似于数据库中的乐 ...

  9. golang数据结构之递归解决迷宫问题

    简单来说:递归就是函数/方法自己调用自己,只是每次传入不同的变量. 递归可以解决各种数学问题:n皇后问题.阶乘问题.汉诺塔.迷宫问题.球和篮子问题等等: maze.go package maze im ...

  10. Saiku ui-settings接口404错误避免(二十九)

    Saiku ui-settings接口404错误避免 自己手动编译的saiku ,不知道为什么前端总是报错   /saiku/rest/saiku/info/ui-settings  404NotFo ...