[读书心得] .NET中 类型,对象,线程栈,托管堆在运行时的关系
.NET中 类型,对象,线程栈,托管堆 在运行时的关系
The Relationship at Run Time between Types,Objects,A Thread's Stack,and The Managed Heap for .NET
by 唐小崇
http://www.cnblogs.com/tangchong
.NET中的类型,无论是值类型或引用类型都是继承自Object的类。这点跟Java类似,但与C/C++有很大不同。既然值类型与引用类型都是类,那它们的没有什么不同的地方。而最值得关注的不同就是:值类型对象的值直接存储在线程栈中,引用类型对象的值存放在托管堆中,它的引用存放在线程栈中。本篇博文就谈谈CLR的线程栈,托管堆策略。
当我们执行一个.NET程序, CLR 会加载一个新的进程,这个进程可能会(按照程序的编写需求)包含多个线程。当一个线程被创建,它会申请一个 1MB大小栈(stack)。这个栈是以高位到地位保存的。线程栈是用来保存本地变量,参数,返回地址的,稍后会有详细解释。同时CLR会创建一个托管堆。(由于内容太多,先从线程栈开始讲起,稍后再讲托管堆)
现在,让我们通过两个例子方法M1,M2来了解线程栈与类型对象的关系:
我们先看看线程栈的样子。图1为一个线程栈的示例,我们假设该程序已经执行了一部分代码,并即将执行M1方法。
aaarticlea/jpeg;base64,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" alt="" />
图1:线程栈示例
线程栈有以下作用:
·保存向某个方法传递的参数(passing arguments);
·保存当前执行的方法内的本地变量(local variales);
·保存当前执行方法的返回地址(return address);
所有的方法都会包含一些 序幕代码(prologue code)和 收场代码(epilogue code) ,序幕代码用来初始化一个方法,这些代码把本地变量,参数,返回地址压入线程栈中。而收场代码会在函数执行完毕后会清理给该函数分配的空间,并将指令指针(CPU's instruction pointer)指向返回地址(即指向该函数的调用者),从而释放线程栈空间。
当我们开始执行M1,CLR将 本地变量name、向M2传递的参数s 和 返回地址 压入线程栈中,如图2所示:
aaarticlea/jpeg;base64,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" alt="" />
图2:将本地变量name、向M2传递的参数s和返回地址压入线程栈中
接着我们执行到M2(name);CLR开始调用M2方法,这时序幕代码会在线程栈里分配两个本地变量 length,tally,如图3所示。当M2方法执行完毕后,收场代码清理M2分配的空间,并将指令指针指向返回地址(即M1)。此时,我们的线程栈又回到图2所示的状态。
图3:M2方法开始执行时线程栈的情况
以上,就是整个线程栈的执行情况。
我们接着来看看CLR中的托管堆。说到托管堆,就不得不提引用类型。下面我们列两个示例类,Employee和它的子类Manager:
internal class Employee {
public Int32 GetYearsEmployed() { ... }
public virtual String GetProgressReport() { ... }
public static Employee Lookup(String name) { ... }
} internal sealed class Manager : Employee {
public override String GetProgressReport() { ... }
如图4所示:我们现在加入一个新方法M3。当我们的程序开始执行,CLR 会初始化线程栈和托管堆。
首先JIT编译器将M3方法的中间代码(IL)JIT编译为本地指令(native CPU instructions)。
然后CLR检测M3引用的所有类型(本例中为Employee,Int32,Manager,String),这时CLR会确保提供这些类型的程序集已经被加载(否则,会报错)。
最后CLR提取有关这些类型的信息,并创建一些数据结构(Type Object)来表示的类型本身。也就是说,CLR会先创建 Type Object,然后通过它来创建类的实例对象。
图4:当M3方法被调用。CLR在托管堆中创建对应的类的类型对象(Type Object)
在创建好的类型对象 Type Object(并不是类的实例对象)中包括以下成员
类型对象指针(Type object ptr)
同步块索引(Sync block index)
静态成员(Statoc fieds)
方法列表(method table)
紧接着,当CLR确认M3所需求的所有的类型对象(Type Object)都被创建,则开始执行M3的本地代码。如图5所示,序幕代码在线程栈中创建本地变量并将它们初始化为null或者0。
图5 序幕代码在线程栈中创建本地变量
程序开始执行e = new Manager();
如图6所示,这行代码指示CLR在托管堆中创建一个Manager类型的实例对象(instance)。该实例对象包含: 类型对象指针、 同步块索引以及 该类型中的定义成员(包括它的父类成员,在本例中父类为Employee,Object)。
然后,CLR会自动将该实例对象(Manager Object)的 类型对象指针(Type object ptr)指向相应的类型对象(Manager Type Object),此外,CLR会初始化同步块索引和所有成员为0并调用构造器(构造函数)。
最后new 操作符将创建好的实例对象在托管堆中的地址 返回并赋值给线程栈中的引用类型变量e。
图6:创建并初始化一个Manager实例对象
下面我们看看3种不同的方法:静态方法,非虚方法,虚方法的执行情况。
下一行代码是e = Employee.Lookup("Joe"); 这里调用了Employee的静态方法Lookup()。
如图7所示,当调用一个静态方法,首先JIT编译器会定位到该方法对应的类型Type Object对象(本例中为Employee Type Object)。然后将该Type Object函数列表中的对应方法(本例中是Lookup)JIT编译,并执行。
我们假设Joe存在并且是一个经理,则Lookup函数会在托管堆中创建一个Manager实例对象,并用Joe初始化它。最后将这个Manager实例对象的地址返回,赋值给e。
图7:静态函数Lookup被调用,创建并用joe初始化一个Manager 对象,并赋值给e
继续执行下一行代码:year = e.GetYearsEmployed();
如图8所示:当我们调用一个非虚函数(nonvirtual instance method),JIT编译器会定位到 调用者的类型(e的类型为Employee)对应Type Object中(本例中为Employee Type Object)。在该Type Object中的方法列表中,查找对应方法(如果没找到,会向其父类寻找直到Object为止)。JIT编译该方法,并执行。我们不妨假设joe已经工作5年了。则Employee 的 GetYearsEmployed方法返回5,并赋值给线程栈中的year变量。
图8:调用Employee的非虚函数 GetYearsEmployed。
接下来一行代码是e.GetProgressReport();该方法是一个虚方法(virtual instance method)。
调用一个虚方法前,JIT编译器会额外的执行一些代码。这些代码会先查找到 调用该方法的变量(e)所指向的实例对象(在本例中,即为用Joe初始化的Manager实例对象)。接下来,检查该对象中的类型对象指针,以找到对象的真正类型type object(本例中为Manager Type Object)。最后JIT编译该type object方法列表中的对应方法,并执行。
如图9所示,JIT编译并执行的是 Manager Type Object中的GetProgressReprot方法,而不是Employee Type Object中的。
图9:调用虚函数GetProgerssReport(),实际类型Manager的type Object中的方法被执行
至此,示例代码结束。我们讨论了调用静态方法,非虚函数,虚函数的三种情况。但我们还有一点没有完成。
我们会注意到在Type Object中也有Type object ptr,这是因为这些Type Object也是一个“类型”的实例对象。它们的类型比较特殊,叫做System.Type,定义在MSCorLib.dll中。当CLR开始执行一个进程,它会先为System.Type创建一个Type Oject,称为Type Type Object。如图10所示,本例的 Employee Type Object,Manager Type Object都是Type Type Object的“实例对象”。最后,Type Type Object 本身也是一个对象,它的Type object ptr 指向自身。这就是.NET 万物皆对象的思想。
图10:Emloyee和Manager的type objects 是 System.Type 类型的实例对象
[读书心得] .NET中 类型,对象,线程栈,托管堆在运行时的关系的更多相关文章
- .NET中 类型,对象,线程栈,托管堆在运行时的关系
.NET中 类型,对象,线程栈,托管堆在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and T ...
- C# 类型、对象、线程栈和托管堆在运行时的关系
我们将讨论类型.对象.线程栈和托管堆在运行时的相互关系,假定有以下两个类定义: internal class Employee { public int GetYearsEmplo ...
- 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法(第二次修改)
1.线程栈 window的一个进程加载clr.该进程可能含有多个线程,线程创建的时候会分配1MB的栈空间. 如图: void Method() { string name="zhangsan ...
- C# (类型、对象、线程栈和托管堆)在运行时的相互关系
在介绍运行时的关系之前,先从一些计算机基础只是入手,如下图: 该图展示了已加载CLR的一个windows进程,该进程可能有多个线程,线程创建时会分配到1MB的栈空间.栈空间用于向方法传递实参,方法定义 ...
- [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...
- scala如何在任意方法中打印当前线程栈信息(StackTrace)
1.以wordcount为例 package org.apache.spark.examples import org.apache.spark.{SparkConf, SparkContext} / ...
- 【性能优化】面试官:Java中的对象都是在堆上分配的吗?
写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Jav ...
- C# 获取变量或对象的栈与堆地址
C# 获取变量或对象的栈与堆地址 来源 https://www.cnblogs.com/xiaoyaodijun/p/6605070.html using System; using System.C ...
- Qt多线程编程中的对象线程与函数执行线程
近来用Qt编写一段多线程的TcpSocket通信程序,被其中Qt中报的几个warning搞晕了,一会儿是说“Cannot create children for a parent that is in ...
随机推荐
- Team City的安装1
持续集成工具 Team City的安装 前两个月很大一部分精力投入在做部门的持续集成,从概念的了解和工具的选型,再到安装,部署,操作,到最后的真实项目持续集成应用的上线,写了一份手册,包括安装,配置, ...
- 【百度地图API】如何制作一张魔兽地图!!——CS地图也可以,哈哈哈
原文:[百度地图API]如何制作一张魔兽地图!!--CS地图也可以,哈哈哈 摘要: 你玩魔兽不?你知道如何做一张魔兽地图不?! 快来看此文吧! ---------------------------- ...
- C#中ISpostback
响应客户端控件时ispostback为true 代码: using System; using System.Collections.Generic; using System.Linq; using ...
- Windows 10技术布局,谈微软王者归来
Windows 10技术布局,谈微软王者归来 每个时代都有王者,王者的成功,往往是因为恰逢其时地发布了一个成功的产品(具有里程碑意义,划时代的产品).Windows 95的成功标示着微软是PC时代的王 ...
- Spark入门级小玩
·背景 随着周边吐槽hadoop的声音渐渐多起来之后,spark也逐渐进入了大家的视野.之前,笔者有粗略的写过一篇spark的安装和性能比较[http://www.cnblogs.com/zacard ...
- 浅谈javascript性能-管理内存
上次说到,javascript脚本到底应该放在哪里?用什么用处? 以下2点: 在Html.Body部分中的JS会在页面加载的时候执行.即-用户触发一个事件的时候执行的脚本.eg:onload事件... ...
- JSP+Java+properties+FileInputStream文件读写,JSP页面读取properties文件
String realPath = request.getRealPath("WEB-INF/classes/com/properties/devicetype.properties&quo ...
- W5500问题集锦(一)
在"WIZnet杯"以太网技术竞赛中,有非常多參赛者在使用中对W5500有各种各样的疑问,对于这款WIZnet新推出的以太网芯片,使用中大家是不是也一样存在下面问题呢?来看一看: ...
- AutoMapper 创建嵌套对象映射(原创)
之前在做DTO转换时,用到AutoMapper.但DTO的层次太深了,无奈官方没针对嵌套类型提供好的解决方案,于是自己实现了一下: 思路:采用递归和反射很好的避免手工创建嵌套对象的映射. 第一个版本, ...
- NHibernate中使用memcache二级缓存
在NHibernate中使用memcache二级缓存 一.Windows下安装Memcache 1. 下载 http://jehiah.cz/projects/memcached-win32/ ...