您的位置:首页 > 其它

.net 垃圾回收学习[Stack 和 Heap的理解]

2011-08-20 11:43 267 查看
from: http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap

CLR的内存管理经常涉及到的两个字就是“堆栈”,CLR针对在这两种不同结构上的对象采取了不同的内存管理模式,所以需要先了解和区分“堆栈“。

先原文翻译一下,这篇Q&A比较有意思,有很多人解释了stack 和 heap的区别,涉及了方方面面,答案方面也是不止一个答案投票很多。

Questions:

编程类书籍经常解释说值类型是创建在Stack上的,引用类型是创建在heap上的,却没有解释这两种(stack和heap)到底是什么东西, 因为我只有在高级编程语言的编程经历,我对这两个概念不是很清楚,我的意思是我知道Stack是什么,但是我想知道这两个概念和计算机的物理内存的关系:

在什么程度上他们被OS或者Languae Runtime 控制?

其范围是什么?

什么决定了他们的大小?

什么因素决定了他们中的一个比另外一个更快一些?

答案一(被采为答案的)

Stack是为执行线程而预留的一个内存区块(The stack is the memory set aside as scratch space for a thread of execution)。当函数被调用的时候,函数相关的局部变量和变量引用(bookkeeping data 注:这里应该指的是保留对象的指针或者引用)会被保留在stack顶部的一个区块中,当函数返回的时候,个区块就失去了使用价值,可以被下次的函数调用所使用。 stack始终保持着后进先出的顺序,最近的保留快(the most recently reserved block)也是最新被释放的,这使得对Stack的使用情况的跟踪变得非常容易,释放stack的内存块只需要移动Stack上的指针即可。

栈一般都多大?

heap是为了进行动态内存分配保留的内存区块(the heap is memory set aside for dynamic allociation). 和stack不同,对heap上的内存空间的申请和释放并没有强制的模式,可以在任意时间申请内存空间,也可以在任意时间释放内存空间,这使得在任一时间上追踪在heap的分配和释放情况比较复杂,根据不同的使用模式有很多种不同的heap空间申请分配算法来提高heap的性能。

每一个线程创建的同时都会创建一个Stack,在一般来说一个Application只有一个heap. (当然,比较常见的是根据分配heap空间的不同类型存在多个heap).

直接回答问题:

OS在每个线程创建的时候为每个系统级别的线程分配Stack,对于heap来说,比较常见的情况是由Language Runtimee来向OS申请Application需要的heap空间。

Stack是附属于特定的Thread的,当Thread推出的时候Stack即被回收了。 heap通常在Applcation启动的时候由Runtime来分配,当Application推出的时候被回收了。

stack的大小是在Thread创建的时候设置的。 heap的大小是在Application 启动的时候设置的,但是可以根据需要增长(内存Allocator可以向OS申请更多的内存)。

stack比栈更快一些,主要是因为两者对内存的访问上stack比较直接一些,heap则由于需要记录分配和释放的空间情况而访问更负责一些。当然,由于stack中的字节被使用的更频繁一些,意味着这些内容可能会被映射到CPU 的缓存中,从而速度更快一些。

有个图片和链接可以帮助理解一下:

http://vikashazrati.wordpress.com/2007/10/01/quicktip-java-basics-stack-and-heap/



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐