托管堆的内存分配

1:托管堆

   定义:应用程序在进程初始化之后,CLR在进程的可用地址空间里分配一段保留的地址空间;它是进程的可用地址空间中的一块内存区域,但并不对应任何物理内存,这块地址空间就是托管堆。

  分类:根据存储信息不同划分,最重要的是:垃圾回收堆(GC heap)和加载堆(Loader Heap)

            GC heap:存储的是对象实例,受GC管理。

            Loader Heap:存储最重要的信息是元数据相关的信息,即type对象。不受GC管理,生命周期从创建到AppDomain卸载。其中每个type对象在Loader heap中表现为一个method table(方法表:记录存储的元数据信息)


2:TypeHandle:类型句柄,指向对象实例的方法表。每个对象在创建的时候都包含了该附加成员,它占内存的4个字节。

3:SyncBlockIndex:用于线程同步,它的值指示线程的同步状态。每个对象在创建的时候都包含了该附加成员,指向一块被称为 Synchronization Block的内存块,占4个字节的内存空间。

4:NextObjPtr:是托管堆维护的一个指针,用于指向下一个新建对象分配时在托管堆中的位置。

5:testobj test = new testobj(); // 反汇编后,new操作被编译为 newobj指令。

6:堆的分配是向高地址扩展:低地址到高地址(和栈的分配相反)

             

  


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#的内存分配机制基于托管(managed heap)和垃圾回收(garbage collection)。 1. 托管(Managed Heap):在C#中,所有的对象都存储托管中。托管是一块被.NET运行时分配的内存区域,用于存储托管对象的实例和数据。托管是按照分代(generational)的方式进行管理,将对象分为不同的代,根据对象的生命周期和使用频率来优化垃圾回收效率。 2. 对象创建:当使用`new`关键字创建一个对象时,CLR(Common Language Runtime)会在托管上分配一块足够大小的内存来存储对象的数据。CLR会进行必要的初始化工作,如设置对象头信息等。 3. 垃圾回收:C#采用垃圾回收机制来管理内存分配和释放。垃圾回收器会定期扫描托管,标记那些仍然被引用的对象,并清除那些没有被引用的对象。垃圾回收器使用了根引用(root references)来确定哪些对象是活动的,其他对象则被认为是可回收的。 4. 引用计数:在某些情况下,C#的垃圾回收器可能会使用引用计数来辅助确定对象是否可以被回收。每当一个对象被引用时,引用计数加1;当一个引用被取消或离开作用域时,引用计数减1。当引用计数为0时,对象可以被回收。 需要注意的是,C#的垃圾回收器并非实时的,而是在需要的时候进行垃圾回收。具体的垃圾回收策略和算法由.NET运行时环境负责管理,而开发人员无需手动进行内存管理。不过,开发人员可以通过使用`IDisposable`接口手动释放一些非托管资源,以提前释放内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值