类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法(第二次修改)
1、线程栈
window的一个进程加载clr。该进程可能含有多个线程,线程创建的时候会分配1MB的栈空间。
如图:
void Method()
{
string name="zhangsan"; //name 被放入栈里面
Method2(name); //1参数变量s 被压入栈,s引用name的地址 2.返回地址被压入栈,方法执行完(method2的 return)指针指向此返回地址
return;
}
void Method2(string s)
{
int32 length=s.Length;
int32 tally;
return; //methed2执行完后,指针指向线程栈的返回地址,method2的栈帧展开
}

2.运行时关系
现有如下2个类型
internal class Employee
{
public int32 M1(){.....};
public virtual string M2(){.....};
public static Employee M3(string name){.....};
}
internal sealed class Manager:Employee
{
public override string M2(){.....};
}
准备:window进程已经开启,clr已经加载到进程里面,托管堆已经初始化,线程栈也已经被创建(连同它的1MB的栈空间)
void M4()
{
Employee e;
int32 age;
e=new Manager();
e=Employee.M3("zhangsan");
age=e.M1();
e.M2();
}
a.首先介绍下new 关键字的执行的时候会执行什么
1.clr计算出类型的所有实例字段的字节和所有基类型的实例字段的字节长度,创建类型对象指针和同步块索引(也计算在字节长度内)
2.在托管堆上分配第一步长度的空间
3.初始化类型对象指针(指向类型对象)和同步块索引
4.调用类型的实例构造器。
b.运行关系图

c.详细解释
1.M4运行的时候 先在线程栈 压入e和age两个局部变量
2.e=new Manager();会在托管推上分配Manager和所有基类的实例字段字节大小,初始化类型对象指针,指向Manager类型对象。
3 调用静态方法,Employee.M3("zhangsan");直接找到M3j静态方法的定义类型Employee,然后去类型对象的方法列表中找到这个方法( 第一个对象将被垃圾回收器回收),
然后JIT进行编译,然后执行。
4.调用非虚方法,e.M1(); 找到变量e的声名类型(Employee),在方法列表中找到对应的方法,编译执行(如果没有就向上回溯直到System.Object,能够会所查找方法是因为在派生类中有指向基类的引用)
5.调用虚方法,e.M2()找到e对象,利用其指针找到e 的实例对象类型(Manager对象),在利用实例对象的类型对象指针找到对象的实际的类型对象(Manager),调用Manager类型对象方法列表中的M2 而不是Employee中的。
类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法(第二次修改)的更多相关文章
- .NET中 类型,对象,线程栈,托管堆在运行时的关系
.NET中 类型,对象,线程栈,托管堆在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and T ...
- [读书心得] .NET中 类型,对象,线程栈,托管堆在运行时的关系
.NET中 类型,对象,线程栈,托管堆 在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and ...
- C# 类型、对象、线程栈和托管堆在运行时的关系
我们将讨论类型.对象.线程栈和托管堆在运行时的相互关系,假定有以下两个类定义: internal class Employee { public int GetYearsEmplo ...
- C# (类型、对象、线程栈和托管堆)在运行时的相互关系
在介绍运行时的关系之前,先从一些计算机基础只是入手,如下图: 该图展示了已加载CLR的一个windows进程,该进程可能有多个线程,线程创建时会分配到1MB的栈空间.栈空间用于向方法传递实参,方法定义 ...
- [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...
- C# 运行时的关系
简介 记录c#对象在托管堆中运行时的相互关系,如下记录了一个方法在执行时候的生命周期,当方法在之前,CLR会先执行将方法里面所有用到的局部变量.参数对应的内存地址等全部存放当前线程栈当中,并且会将所有 ...
- (59)Wangdao.com第十天_JavaScript 对象在 栈和堆
对象的属性值 如果要使用特殊的属性名,需 对象["属性名"] = 属性值 // 存 对象["属性名"] // 取 obj["1 ...
- C# 获取变量或对象的栈与堆地址
C# 获取变量或对象的栈与堆地址 来源 https://www.cnblogs.com/xiaoyaodijun/p/6605070.html using System; using System.C ...
- 关于Class对象、类加载机制、虚拟机运行时的内存布局的全面解析和推测
简介: 本文是对Java的类加载机制,Class对象,反射原理等相关概念的理解.验证和Java虚拟机中内存布局的一些推测.本文重点讲述了如何理解Class对象以及Class对象的作用. 欢迎探讨,如有 ...
随机推荐
- android项目生成aar和引用aar解决方案
引用依赖在项目中很常见,java开发一般是引用jar,所以android大家一般也是引用jar,但是android引用jar有时候会出现各种包冲突,很头痛!, 其实android有自己独特的引用aar ...
- 记一个centos分区大小调整过程
1. 备份 /home 目录 [root@centos ~]# cp -r /home /home_backup 2. 查看目前磁盘使用的情况, 需要将 /dev/mapper/centos-home ...
- 关于浏览器跨域的一种实现--jsonp
最近一直在搞python,前端技术荒废很久了,今天跟前端联调,设计到一个前端跨域的问题:前端人员告诉我可以用jsonp的方式实现,经他这么一提醒,也是豁然开朗. jsonp的实现方式我按照我的理解说一 ...
- Redis-02.数据类型
Redis中所有数据都是以key-value存储的,value支持的数据类型包括string.hash.list.set.sorted_set 数据类型 string 是redis最基本的类型,一个k ...
- Android JNI 学习(三):JNI 数据类型和数据结构
本文我们来讨论一下JNI如何将Java类型映射到本机C类型. 一.基本数据类型 如下图表整理了Java基本类型和native对应的关系: Java类型 Native类型 描述 boolean jboo ...
- eclipse对于标签的配置不会出现自动提示的解决
解决办法:引入 mybatis-3-config.dtd 文件Window-preferences-搜索 xml-xml catalog在 User Specified Entries 目录下 add ...
- JDK设计模式之——工厂模式
1.首先来看最普通的工厂模式 1.1 定义一个需要工厂生产的java类 package javaee.net.cn.factory; class Person{ private int age; pr ...
- 一位90后的自述:如何从年薪3w到30w
作者介绍:90后生人/男/二本本科/世界500强技术主管 1.引言 上海小胖,曾就职于pwc(普华永道)担任TechLeader,带领DS(Data Scientist)团队完成全美医疗保险大数据项目 ...
- 使用eclipse创建maven+动态web的项目
windows7操作系统 提前安装java jdk1.8版本+apache-maven-3.3.3+wildfly-10.0.0.Final 1.新建maven项目,到other里面找一下 2.使用默 ...
- jquery click嵌套 事件重复注册 多次执行的问题解决
jquery click事件中嵌套click会重复注册内部的click事件,导致重复执行. 比如 $(...).click(function(){ $(...).click(function(){ ...