堆与栈都是内存空间的一部分,其中,堆又可以分为托管堆和非托管堆。托管堆和栈由 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 堆的内存分配是连续的。当垃圾收集结束之后,由于有些空间被释放,内存可能出现碎片,此时,会进行压缩,将内存重新变回连续状态。
参考: