C#内存分配、堆栈的分配介绍

二。
内存分配关于内存的分配,首先应该了解分配在哪里的问题。
CLR管理内存
【菜科解读】
在分析内存分配时,应该先了解关于堆栈的区别
堆的分配向高地址扩展,而栈的分配向低地址扩展。
二。
内存分配
关于内存的分配,首先应该了解分配在哪里的问题。
CLR管理内存的区域,主要有三块,分别为:· 线程的堆栈,用于分配值类型实例。
堆栈主要由操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时,其存储单位自动释放。
栈的执行效率高,但存储容量有限。
· GC堆,用于分配小对象实例。
如果引用类型对象的实例大小小于85000字节,实例将被分配在GC堆上,当有内存分配或者回收时,垃圾收集器可能会对GC堆进行压缩,详情见后文讲述。
1 public class VIPUser:User2 {3 //分配1Byte4 public bool isVip;5 public bool IsVipUser()6 {7 return isVip;8 }9 static void Main(string[] args)10 {11 //分配内存空间和初始化操作12 VIPUser aUser;13 //将对象引用赋给aUser变量,建立aUser和VIPUser的关联14 aUser = new VIPUser();15 //Q:类型的分配的字节数?16 //就本类而言需要15Byte。
但是实例对象所占的字节总数还要加上对象附加成员所需的字节数,其中包括附加成员TypeHandle和SyncBlockIndex共8个字节。
在托管堆上分配的字节总数为23字节,而堆上的内存块总是按照4Byte的倍数进行分配,因此本类中将分配24字节的地址空间17 18 //最后调用对象构造器,进行对象初始化操作,完成创建19 20 //构造过程21 //a.构造VIPUser类型的Type对象,主要包括静态字段、方法表、实现的接口等,并将其分配在上文提到托管堆的Loader Heap上。
22 23 //b.初始化aUser的两个附加成员:TypeHandle和SyncBlockIndex。
将TypeHandle指针指向Loader Heap上的MethodTable,CLR将根据TypeHandle来定位具体的Type;将SyncBlockIndex指针指向Synchronization Block的内存块,用于在多线程环境下对实例对象的同步操作。
24 25 //c.调用VIPUser的构造器,进行实例字段的初始化。
实例初始化时,会首先向上递归执行父类初始化,直到完成System.Object类型的初始化,然后再返回执行子类的初始化,直到执行VIPUser类为止。
以本例而言,初始化过程为首先执行System.Object类,再执行User类,最后才是VIPUser类。
最终,newobj分配的托管堆的内存地址,被传递给VIPUser的this参数,并将其引用传给栈上声明的aUser。
26 27 aUser.isVip = true;28 Console.WriteLine(aUser.IsVipUser());29 //上述过程,基本完成了一个引用类型创建、内存分配和初始化的整个流程30 }31 }32 public class UserInfo33 {34 //分配4个字节35 private Int32 age = -1;36 //分配2个字节37 private char level = 'A';38 }39 public class User40 {41 //分配4byte42 private Int32 id;43 //保存了UserInfo的引用 占用4Byte44 //仅是一个引用(指针),保存在线程的堆栈上,占用4Byte的内存空间 用于保存user对象的有效地址 现在试图对user的任何操作将抛出NullReferenceException45 private UserInfo user;46 }
LOH(Large Object Heap)堆,用于分配大对象实例。
如果引用类型对象的实例大小不小于85000字节时,该实例将被分配到LOH堆上,而LOH堆不会被压缩,而且只在完全GC回收时被回收。
在了解内存分配之前 首先了解一下三个概念
TypeHandle,类型句柄,指向对应实例的方法表,每个对象创建时都包含该附加成员,并且占用4个字节的内存空间。
我们知道,每个类型都对应于一个方法表,方法表创建于编译时,主要包含了类型的特征信息、实现的接口数目、方法表的slot数目等。
· SyncBlockIndex,用于线程同步,每个对象创建时也包含该附加成员,它指向一块被称为Synchronization Block的内存块,用于管理对象同步,同样占用4个字节的内存空间。
· NextObjPtr,由托管堆维护的一个指针,用于标识下一个新建对象分配时在托管堆中所处的位置。
CLR初始化时,NextObjPtr位于托管堆的基地址。
三。
继承本质论
1 //Bird bird创建的是一个对象的引用,而new Bird()是创建Bird对象,分配内存和初始化操作,然后将对象引用赋给bird变量,也就是简历bird和Bird 之间的关联2 Bird bird = new Bird();3 //2.从继承的角度来分析CLR在运行时如何执行对象的创建过程4 //2.1 首先是字段的创建 字段的存储顺序由上到下排列,最高层类的字段排在最前面5 //2.2方法表的创建是类第一次加载到AppDomain时完成的,在对象创建时只是将其附加成员TypeHandle指向方法列表Loader Heap上的地址,将对象与其动态方法列表相关联起来,因此方法表示先于对象存在的。
6 Chicken ch = new Chicken();
内存,分配,、,堆栈,的,介绍,在,分析,内存,技术编辑教您win7虚拟内存如何设置最好
但是很多朋友不知道虚拟内存怎么设置,为了大家能够更好的使用电脑,下面小编就来说一下虚拟内存设置的步骤。
有些朋友的电脑因为内存不够多少很卡,除了增加物理内存外我们还可以通过增加虚拟内存的方式来解决这个问题,今天小编就以win7系统为例来跟各位讲解一下虚拟内存设置的方法。
win7虚拟内存怎么设置最好 1.进入win7桌面,鼠标右键“计算机”,选择“属性”打开。
win7虚拟内存怎么设置最好示例1 2.在弹出的界面右侧选择“高级系统设置”,然后切换到“高级”选项,点击“.”按钮打开。
虚拟内存示例2 3.在性能选项界面切换到“高级”选项卡,然后点击“更改 按钮,进入下一步。
win7虚拟内存怎么设置最好示例3 4.在虚拟内存设置是界面中取消勾选“自动管理所有驱动器的分页文件大小(A)”,然后选择要设置虚拟内存的盘符,勾选“自定义大小”,然后设置合理的虚拟内存大小,点击确定即可。
内存示例4 温馨提醒:对虚拟内存的大小的设置,建议的设置范围为:1-2倍物理内存。
现在知道虚拟内存怎么设置最好了吧,希望对您有帮助哦! 虚拟内存,虚拟内存设置,win7虚拟内存怎么设置最好,内存
内存释放专家
它可以帮助用户释放内存空间,提升设备的运行速度和性能。
下面通过一个案例来引出这个标题。
小明是一位电脑爱好者,他的电脑运行速度越来越慢,经常出现卡顿现象。
他尝试了很多方法,但都没有解决问题。
直到他使用了内存释放专家,他的电脑才恢复了正常。
本文将介绍内存释放专家的工具原料、详细说明其使用方法,并总结其优点和建议。
工具原料:系统版本:Windows 10品牌型号:Dell Inspiron 15软件版本:内存释放专家 2.0一、内存释放专家的使用方法1、打开内存释放专家软件,进入主界面。
2、点击“一键优化”按钮,软件会自动扫描并释放内存空间。
3、用户还可以手动选择要释放的内存,点击“释放”按钮即可。
二、内存释放专家的优点1、高效释放内存:内存释放专家能够快速而有效地释放内存空间,提升设备的运行速度。
2、智能优化:软件具有智能优化功能,能够根据设备的实际情况进行优化,避免误操作。
3、简单易用:内存释放专家的操作界面简洁明了,用户只需点击几个按钮即可完成内存释放。
三、内存释放专家的建议1、定期使用:建议用户定期使用内存释放专家进行内存优化,以保持设备的良好运行状态。
2、注意选择:在选择内存释放软件时,用户应该选择信誉好、口碑佳的软件,以免下载到恶意软件。
总结:内存释放专家是一款功能强大、操作简单的内存优化工具。
它能够帮助用户释放内存空间,提升设备的运行速度和性能。
建议用户定期使用内存释放专家进行内存优化,同时注意选择可靠的软件。
未来,我们可以进一步研究和开发更加智能化的内存优化工具,以满足用户不断增长的需求。