c#中栈和堆的理解
之前对栈(stack)和堆(heap)的认识很模糊,今天看了一篇关于堆栈的文章《译文---C#堆VS栈》后,仿佛有种拨开云雾见青天的感觉,当然只是一些浅显的理论的认识,这里做一些简单的记录,方便自己记忆理解,同时也可以供大家参考!
1.栈(stack)和堆(heap)的事例理解
在内存中,栈(stack)和堆(heap)可以理解为两个存储容器。
栈是一个先进后出顺序排列的容器,比如一垛蒸笼包(如图1-1),最后一笼是最后放上去的,只有把最后一笼吃完或拿出来,才能继续吃下面的,依次执行。
堆也是按一定顺序排列的容器,比如你的衣橱(如图1-2),排放是整洁有序的,但是你拿任意一件衣服,不用动其他衣服,能快速的拿到我们想要的衣服。
图1-1 图1-2
2.堆和栈上的垃圾回收机制
栈有自我维护特性,执行完语句马上释放不会造成资源泄漏。
堆需要GC(垃圾回收器 Garbage Collection)不定时的回收已不再使用的资源则需,并且符合GC回收的规则,很多堆上的内容在程序退出前都没有被回收,很可能是无意中某处还保留着内容的引用导致,这将严重影响性能,GC回收一般发生在程序内存不够用时,否则不会发生,除非手动调用GC强制执行回收资源。
3.栈(stack)和堆(heap)中存储的数据类型
这里的数据类型特指值类型(基本数据类型,结构,数组)和引用类型(类,string,object,接口,委托)。
值类型存储在栈或堆中取决于声明的位置,引用类型总是存储在堆上。