C#堆和栈

堆与栈都是内存空间的一部分,其中,堆又可以分为托管堆和非托管堆。托管堆和栈由 CLR 管理。

这里的堆(heap)是托管堆(managed heap)的简称。顾名思义,它由 CLR 进行管理。

它是在运行程序时,CLR 申请的一块内存空间。它基于进程,属于进程内存空间的一部分。

当创建新对象时,若该对象是引用类型或者包括引用类型的值类型,就会在 GC 堆上申请空闲的内存空间,CLR 会先计算需要的空间大小。如果堆上已经没有剩余空间了,就触发一次垃圾回收。如果回收之后仍然无法获得足够的剩余空间,则掷出 OutOfMemory 异常。

GC 堆维护一个叫做 NextObjPtr 的指针,指向 GC 堆的下一个可用地址。为了尽量合理利用空间,GC 堆的内存分配是连续的。当垃圾收集结束之后,由于有些空间被释放,内存可能出现碎片,此时,会进行压缩,将内存重新变回连续状态。

这里的堆(heap)是托管堆(managed heap)的简称。顾名思义,它由 CLR 进行管理。

它是在运行程序时,CLR 申请的一块内存空间。它基于进程,属于进程内存空间的一部分。

当创建新对象时,若该对象是引用类型或者包括引用类型的值类型,就会在 GC 堆上申请空闲的内存空间,CLR 会先计算需要的空间大小。如果堆上已经没有剩余空间了,就触发一次垃圾回收。如果回收之后仍然无法获得足够的剩余空间,则掷出 OutOfMemory 异常。

GC 堆维护一个叫做 NextObjPtr 的指针,指向 GC 堆的下一个可用地址。为了尽量合理利用空间,GC 堆的内存分配是连续的。当垃圾收集结束之后,由于有些空间被释放,内存可能出现碎片,此时,会进行压缩,将内存重新变回连续状态。

参考:

http://c.biancheng.net/view/3070.html

https://www.cnblogs.com/zd1994/p/4424329.html

原文地址:https://www.cnblogs.com/zwh1993/p/11248838.html