您的位置 首页 java

C#之堆与栈

堆与栈

堆与栈都是内存空间的一部分,堆分为托管堆和非托管堆,托管堆由CLR管理,对非托管堆的管理则由开发者完成。

托管堆是运行程序时,CLR申请的一块内存空间。

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

为了合理利用空间,GC堆内存分配是连续的,垃圾回收结束,部分空间被释放,会有内存碎片,此时进行压缩,将内存重新变为连续状态。

非托管资源占用另一部分的内存,叫做本地堆或者非托管堆。CLR不负责这一块的垃圾回收,常见的非托管资源有文件流、数据库连接、打印机资源等。

是一个先进后出的栈数据结构,所以一直是连续的。栈中的对象离开了定义域就会自动销毁,所以栈一般空间是够用的。爆栈也有例子,比如一个没有出口的递归,此时所有的变量都还在它们的定义域中。

对于引用类型,也会使用栈,但栈只是存储一个 地址 ,即引用,就是它在堆上的内存地址,通过访问栈上的地址就可以间接访问到堆上的引用类型对象以及他们的值。

由于栈只能从顶部放入或者拿走数据,所以内存总是连续的,不需要进行GC。

文章来源:智云一二三科技

文章标题:C#之堆与栈

文章地址:https://www.zhihuclub.com/200683.shtml

关于作者: 智云科技

热门文章

网站地图