C#之CLR内存深入分析
作者:shichen2014 发布时间:2023-01-24 17:18:07
本文不再对值类型进行讨论,主要讨论一下引用类型。如要看内存值类型的朋友可以看一下前一篇C#之CLR内存原理初探。
C#引用类型具体分析如下:
先来装备两个类:
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和一个静态方 * ookUp,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返回的就说”类型指针对象“所存储的地址。
猜你喜欢
- 引言♀ 小AD:明哥,昨天气死我了,明哥要帮我出气。♂ 明世隐:咋了,有谁惹到你了。♀ 小AD:昨天辅助喷我小鲁班菜,我反手就对喷,然后竟然
- 经常遇到的问题在实际得开发过程中,我们经常会遇到以下场景,我们后端请求某个接口后获取到得数据,不希望将所有字段都返回给前端,那么我们需要封装
- 问题背景: 我要在一个表单里同时一次性提交多名乘客的个人信息到SpringMVC,前端HTML和SpringMVC Controller里该
- 本文实例讲述了Android编程实现简单文件浏览器功能。分享给大家供大家参考,具体如下:运行效果:布局:<LinearLayout x
- 1. 前言随着数据量和调用量的增长,用户对应用的性能要求越来越高。另外,在实际的服务中,还存在着这样的场景:系统在组装数据的时候,对于数据的
- 1. 判断允许上传文件的 文件后缀/图片后缀/相片后缀 和 其它工具类import org.springframework.stereoty
- 一、数组的基本用法1.什么是数组数组:存储一组相同数据类型的数据的集合。2.定义数组 int[] :int类型数组 do
- 简介:Springboot使用Mybatis&Mybatis-plus 两者文件映射配置略有不同,之前我用的是Mybatis,但公司
- 本文实例为大家分享了C#实现网页画图的具体代码,供大家参考,具体内容如下代码贴着保存下using System;using System.C
- final可以修饰类 ,成员变量,局部变量和方法。1.final修饰成员变量1.final成员变量的初始化对于final修饰的变量,系统不会
- 使用可以绑定数据源的控件我们需要有实现了IList接口的类作为数据源,我们有很多的方法,比如使用ArrayList或者List的泛型类都是很
- Java源码系列三-工具类Arrays今天分享java的源码的第三弹,Arrays这个工具类的源码。因为近期在复习数据结构,了解到Array
- 补充使用Spring Cloud Config加密功能需要下载JCE扩展,用于生成无限长度的密文。链接:http://www.oracle.
- 本文实例为大家分享了java金额数字转中文工具类的具体代码,供大家参考,具体内容如下java金额数字转中文工具类ConvertNum.jav
- 1.构造器也就是在上一篇讲的那个例子,调用默认的无参构造函数2.静态工厂方法1)创建需要执行的方法的类public class HelloW
- 目录一、什么是 RUNNABLE?二、与传统的ready状态的区别三、与传统的running状态的区别四、当I/O阻塞时五、如何看待RUNN
- 前言:时间过得真是快,现在已经是2022年了。作为开发来说,时间处理是非常繁琐的。从Java 8开始有了Java 8 T
- 本文实例讲述了C#实现rar压缩与解压缩文件的方法。分享给大家供大家参考。具体分析如下:此程序利用 WinRAR 程序对文件进行压缩,命令行
- springboot集成mybatis plus和dynamic-datasource注意事项环境spring-boot-starter-p
- 对某个类型中的方法进行拦截,然后加入固定的业务逻辑,这是AOP面向切面编程可以做的事,在springboot里实现aop的方法也有很多, s