c# 托管堆和垃圾回收

本文介绍了C#中托管堆的基础知识,包括通过new操作符分配资源的过程,以及垃圾回收的触发条件,如代码显示调用、低内存情况、AppDomain卸载和进程关闭。同时,讨论了大对象的特性和管理,强调了大对象分配对性能的影响。
摘要由CSDN通过智能技术生成

托管对基础

        在面向对象的环境中,每个类型都代表可供程序使用的一种资源。要使用这些资源,必须为代表资源的类型分配内存。一下是访问一个资源所需要的步骤:

        1.   调用IL指令newobj,为代表资源的类型分配内存(一般使用c# new 操作符来完成)。

        2.   初始化内存,设置资源的初始状态并使资源可用。类型的实例构造器负责设置初始状态。

        3.    访问类型的成员来使用资源(有必要可以重复)。

        4.    摧毁资源的状态以进行清理。

        5.    释放内存。垃圾回收器独自负责这一步。

 

从托管堆分配资源

      C#的new操作符导致CLR执行的步骤:

        1.    计算类型的字段(以及从基类型继承的字段)所需的字节数。

        2.    加上对象的开销所需的字节数。每个对象都有两个开销字段: 类型对象指针和同步块索引。对于32位应用程序,这两个字段各自需要32位,所以每个对象要增加8字节。对于64位应用程序,这两个字段各自需要64位,所以每个对象需要增加16字节。  

        3.    CLR检查区域中是否有分配对象所需的字节数。如果托管堆有足够的可用空间,就在NextObjPtr指针指向的地址处放入对象,为对象分配的字节会被清零。接着调用类型的构造器(为 this 参数传递NextObjPtr), new 操作符返回对象引用。就在返回这个引用之前,NextObjPtr 指针的值会加上对象占用的字节数来得到一个新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值