首先堆栈和堆(托管堆)都在进程的虚拟内存中。(在32位处理器上每个进程的虚拟内存为4GB)
堆栈stack
堆栈中存储值类型。
堆栈实际上是向下填充,即由高内存地址指向地内存地址填充。
堆栈的工作方式是先分配内存的变量后释放(先进后出原则)。
堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突!
堆栈的性能非常高,但是对于所有的变量来说还不太灵活,而且变量的生命周期必须嵌套。
通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内数据仍然可以使用。此时就要用到堆(托管堆)!
堆(托管堆)heap
堆(托管堆)存储引用类型。
此堆非彼堆,.NET中的堆由垃圾收集器自动管理。
与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。
比如创建一个对象:
Customer cus;
cus = new Customer();
申明一个Customer的引用cus,在堆栈上给这个引用分配存储空间。这仅仅只是一个引用,不是实际的Customer对象!
cus占4个字节的空间,包含了存储Customer的引用地址。
接着分配堆上的内存以存储Customer对象的实例,假定Customer对象的实例是32字节,为了在堆上找到一个存储Customer对象的存储位置。
.NET运行库在堆中搜索第一个从未使用的,32字节的连续块存储Customer对象的实例!
然后把分配给Customer对象实例的地址赋给cus变量!
从这个例子中可以看出,建立对象引用的过程比建立值变量的过程复杂,且不能避免性能的降低!
实际上就是.NET运行库保存对的状态信息,在堆中添加新数据时,堆栈中的引用变量也要更新。性能上损失很多!
有种机制在分配变量内存的时候,不会受到堆栈的限制:把一个引用变量的值赋给一个相同类型的变量,那么这两个变量就引用同一个堆中的对象。
当一个应用变量出作用域时,它会从堆栈中删除。但引用对象的数据仍然保留在堆中,一直到程序结束 或者该数据不被任何变量应用时,垃圾收集器会删除它。
堆栈stack
堆栈中存储值类型。
堆栈实际上是向下填充,即由高内存地址指向地内存地址填充。
堆栈的工作方式是先分配内存的变量后释放(先进后出原则)。
堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突!
堆栈的性能非常高,但是对于所有的变量来说还不太灵活,而且变量的生命周期必须嵌套。
通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内数据仍然可以使用。此时就要用到堆(托管堆)!
堆(托管堆)heap
堆(托管堆)存储引用类型。
此堆非彼堆,.NET中的堆由垃圾收集器自动管理。
与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。
比如创建一个对象:
Customer cus;
cus = new Customer();
申明一个Customer的引用cus,在堆栈上给这个引用分配存储空间。这仅仅只是一个引用,不是实际的Customer对象!
cus占4个字节的空间,包含了存储Customer的引用地址。
接着分配堆上的内存以存储Customer对象的实例,假定Customer对象的实例是32字节,为了在堆上找到一个存储Customer对象的存储位置。
.NET运行库在堆中搜索第一个从未使用的,32字节的连续块存储Customer对象的实例!
然后把分配给Customer对象实例的地址赋给cus变量!
从这个例子中可以看出,建立对象引用的过程比建立值变量的过程复杂,且不能避免性能的降低!
实际上就是.NET运行库保存对的状态信息,在堆中添加新数据时,堆栈中的引用变量也要更新。性能上损失很多!
有种机制在分配变量内存的时候,不会受到堆栈的限制:把一个引用变量的值赋给一个相同类型的变量,那么这两个变量就引用同一个堆中的对象。
当一个应用变量出作用域时,它会从堆栈中删除。但引用对象的数据仍然保留在堆中,一直到程序结束 或者该数据不被任何变量应用时,垃圾收集器会删除它。
发表评论
-
C# 实现将文件夹分卷压缩
2015-04-17 17:01 1151http://bbs.csdn.net/topics/3907 ... -
C#发送邮件
2015-04-17 15:58 657public class SendEmailHelper ... -
C# xml文件读取
2015-02-11 16:08 586看附件................ -
什么时候该用委托,为什么要用委托,委托有什么好处....
2015-01-29 16:56 790http://www.cnblogs.com/superpce ... -
C#中动态加载和卸载DLL
2015-01-26 14:02 1385在C++中加载和卸载DLL是一件很容易的事,LoadLibra ... -
转:c#常用的18种设计模式
2015-01-21 08:16 730http://blog.jobbole.com/78130/ -
C#委托的介绍(delegate、Action、Func、predicate)
2015-01-09 17:26 1060http://www.cnblogs.com/akwwl/p/ ... -
接口和抽象类有什么区别 .
2014-12-22 16:35 593接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么 ... -
C#一个简单写日志文件的类
2014-12-11 09:57 1072/// <summary> /// L ... -
Linq初级班 Linq to DataSet体验(单表、多表联合查询JOIN语法)
2014-12-10 14:34 330http://www.cnblogs.com/huangcon ... -
C#泛型详解
2014-11-29 11:31 451我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处 ... -
线程同步与异步的区别
2014-11-26 09:12 849异步处理就是按照不同步的程序处理问题。异步处理与同步处理是对立 ... -
应用C#和SQLCLR编写SQL Server用户定义函数 .
2013-10-09 17:07 451http://blog.csdn.net/zhzuo/arti ... -
log4Net简介
2013-06-30 11:32 546使用log4Net可以将系统听日志保存到DB、日志文件、邮箱中 ... -
DataGridView历史记录的前进与后退操作
2013-06-23 11:13 1080此功能介绍:DataGridView频繁查询数据时,可以将每次 ... -
c# 对INI配置文件的读取操作
2013-06-17 10:51 655此种方法只对如下格式的INI文件起作用 server=loca ... -
对DataGridView控件的扩展开发
2013-06-15 21:47 2341首先在项目中引用 ... -
对集合控件(ListBox,ComboBox,TreeView,RichTextBox,DataGridView)的查找、替换操作控件
2013-06-15 09:39 1525一、程序入口: using System; using ... -
C#对文件、文件夹操作公用组件
2013-06-11 09:46 943namespace HR.Class.IO { / ... -
TreeView控件操作开发篇之(五)
2013-06-09 00:09 792#region 加载文件夹及文件到树 ...
相关推荐
文章主要介绍了堆栈以及堆和栈之间的区别
队列,堆,栈吗,堆栈的区别,对java的学习很有帮助
Thread Dump 是非常有用 Java应用问题的工具。每一个 Java 虚拟机 都有及时生成所有线程在某...照,及JVM 中所有 Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名 及所执行的方法,如果可能的话还有源代码的行数。
C语言堆栈入门——堆和栈的区别
详细阐述了堆和栈的分配和使用原理。详见文档。
java中堆(heap)和堆栈(stack)有什么区别
比较局部变量、全局变量、堆、堆栈、静态和全局的区别和联系。
堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈...
很多人对堆和栈分不清楚,很多数据结构的参考书里堆和栈都是放在一起"堆栈",并没有真正说清楚到底有什么区别. 这个PDF介绍了堆和栈的区别,个人感觉比较详细,作为初学者的参考吧.
很多时候我们在变成的时候会涉及到堆栈的问题,本资源主要对堆和栈进行区分,加以了解
c++中堆、栈的详细说明,以及它们之间的区别。
简单的介绍内存中堆和栈的区别。个人觉得还不错的。
堆和栈的区别 堆和栈的区别 堆和栈的区别
关于堆栈的区别,以及堆栈的效率。
堆和栈的区别,详细介绍了堆和栈的区别并介绍了他们的用法和弊端
java堆-栈-堆栈常量池的区别,史上最全总结
堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,...
堆与栈的区别的详细说明,大家可以从中明白,堆栈的区别
对堆栈的概念进行详细的分析,详细解释堆与栈的区别,适合于对堆栈概念分不清楚的同学
堆和栈的区别.txt堆和栈的区别.txt堆和栈的区别.txt堆和栈的区别.txt堆和栈的区别.txt