C#.net内存分配问题(堆、栈、LOH堆)

本文详细介绍了.NET内存管理的三个关键部分:线程堆栈、GC堆和LOH堆。线程堆栈用于值类型实例,由操作系统管理,执行效率高但容量有限。GC堆主要分配小对象,会根据需要进行压缩。LOH堆则用于存储大对象,不被压缩,仅在GC回收时释放。值类型的内存分配情况在不同场景下有所不同,如类字段和装箱操作。了解这些机制有助于优化.NET应用的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存分为三种:线程的堆栈、GC堆、LOH(large object heap)堆

  • 线程的堆栈:
  1. 用于分配值类型实例;
  2. 有操作系统管理,不受垃圾收集器的控制。当值类型实例所在方法结束时,其存储单位自动释放;
  3. 栈的执行效率高,但是存储容量有限;
  • GC堆:
  1. 用于分配小对象实例。如果对象的实例大小小于85000字节,将分配在GC堆上;
  2. 当有内存分配或者回收时,垃圾收集器可能会对GC堆进行压缩;
  • LOH堆:
  1. 用于分配大对象实例。如果对象的实例大小>=85000字节,将分配在LOH堆上;
  2. LOH堆不会被压缩,只在完成GC回收时被回收;

堆栈的内存分配机制

对于值类型来说,一般创建在线程的堆栈上,但并非所有的值类型都创建在线程的堆栈上,例如作为类的字段时,值类型作为实例成员的一部分也被创建在托管堆上;装箱操作时,值类型字段也会拷贝在托管堆上。

堆栈的内存分配是由高位到低位向下填充,内存的释放从低位到高位进行释放。

 public static void Main()
        {
            int i = 0;
            char= 'a';
        }

例如可用地址为1~100,执行 int i=0时,分配97 ~ 100共4个字节,执行 char= 'a’时,分配95 ~ 96共2个字节,执行到}位置时,方法结束,首先释放95 ~ 96 2个字节,然后释放97 ~ 100

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值