`

堆栈和堆的区别

    博客分类:
  • C#
 
阅读更多
首先堆栈和堆(托管堆)都在进程的虚拟内存中。(在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运行库保存对的状态信息,在堆中添加新数据时,堆栈中的引用变量也要更新。性能上损失很多!

有种机制在分配变量内存的时候,不会受到堆栈的限制:把一个引用变量的值赋给一个相同类型的变量,那么这两个变量就引用同一个堆中的对象。

当一个应用变量出作用域时,它会从堆栈中删除。但引用对象的数据仍然保留在堆中,一直到程序结束 或者该数据不被任何变量应用时,垃圾收集器会删除它。
分享到:
评论

相关推荐

    堆栈和托管堆的详解堆栈和托管堆的详解

    本文将重点讨论C#中的两种主要内存区域:堆栈和托管堆,并探讨它们之间的区别以及各自的应用场景。 #### 二、堆栈 堆栈(Stack)是一种线性数据结构,其遵循先进后出(First In Last Out, FILO)的原则。在C#中,...

    队列 堆 栈 堆栈的区别

    ### 队列、堆、栈与堆栈的区别 #### 队列 队列是一种遵循先进先出(First In First Out, FIFO)原则的数据结构。这意味着最先加入队列的元素将会是最先被移除的元素。队列常用于处理需要按照顺序执行的任务集合,...

    java中堆(heap)和堆栈(stack)有什么区别

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的...

    堆栈以及堆和栈的区别

    堆栈以及堆和栈的区别 堆栈是一种"后进先出"的主存区域,位于堆栈段中,使用SS段寄存器记录其段地址。它只有一个出入口,即当前栈顶,栈顶是地址较小的一端(低端),它用堆栈指针寄存器SP指定。堆栈有两种以字为...

    堆和栈的区别,详细描述了堆栈的分配和使用原理

    理解堆和栈的区别是编写高效、无内存泄漏代码的关键。 首先,我们来看看堆和栈的基本概念: 栈(Stack)是程序运行时由编译器自动管理的内存区域,主要用于存放函数的参数值、局部变量等。栈的操作遵循“后进先出...

    栈和堆栈的区别和联系

    标题和描述中的核心知识点主要集中在计算机科学领域中的数据存储机制,特别是栈(stack)和堆(heap)的区别和联系。为了深入理解这些概念,我们不仅需要掌握它们的基本定义,还要了解它们在实际编程中的应用以及与其他...

    线性表、堆栈、队列

    堆栈常用于函数调用(调用栈)、表达式求值(逆波兰表示法)和内存管理(内存堆)。队列则广泛应用于任务调度、打印机队列、多线程同步(信号量)等场景。 堆栈和队列的操作复杂度分析如下: - 堆栈:push和pop操作...

    JVM堆栈性能分析

    Thread Dump 是非常有用 Java应用问题的工具。每一个 Java 虚拟机 都有及时生成所有线程在某...照,及JVM 中所有 Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名 及所执行的方法,如果可能的话还有源代码的行数。

    栈和堆栈的区别.doc

    ### 栈和堆栈的区别详解 #### 一、程序的内存分配 在深入探讨栈和堆的区别之前,我们首先需要了解程序在运行时是如何管理内存的。程序在运行时主要可以划分为以下几部分: 1. **栈区(Stack)**: - 分配与释放...

    教你识别背照式和堆栈式摄像头元件的区别

    【摄像头元件】是现代智能手机摄像头的关键组成部分,主要分为两种类型:背照式传感器和堆栈式传感器。这两种传感器的设计差异显著影响了它们的性能和成像质量。 **背照式传感器(Backside Illumination Sensor)**...

    堆栈内存区别

    ### 堆栈内存区别详解 在计算机编程与运行环境中,堆栈(Heap vs Stack)是两种关键的数据存储区域,它们各自拥有独特的属性与管理方式,对于程序的性能与资源管理有着深远的影响。本文将深入解析堆栈的区别,探讨...

    局部变量、全局变量、堆、堆栈、静态和全局

    局部变量、全局变量、堆、堆栈、静态和全局变量都是编程中常见的概念,它们在内存管理、作用域和生命周期等方面有着不同的特点。 首先,局部变量是在函数内部声明的变量,它们在函数执行时分配空间,在函数结束时被...

    java 堆栈的演示程序

    4. 深入理解JVM的内存模型,特别是堆栈和堆的区别,以及垃圾回收对堆的影响。 总之,这个"java 堆栈的演示程序"为我们提供了一个实践和学习Java内存管理的绝佳机会,无论是对于初学者还是经验丰富的开发者,都能...

    java堆栈的区别 -- 详解

    ### Java堆栈的区别详解 #### 一、预备知识—程序的内存分配 程序在运行时,根据不同的数据类型和用途,会被分配到不同的内存区域。这些区域包括: 1. **栈区(Stack)**:这部分内存由编译器自动管理,主要用于...

    进程线程及堆栈关系的总结

    ### 进程线程及堆栈关系的总结 #### 一、进程与线程的概念及其关系 **进程**是具有一定独立功能的程序在一个特定数据集合上的运行活动,是系统进行资源分配和调度的一个独立单位。进程是操作系统进行管理和调度的...

    堆栈的名词解释

    在计算机科学领域,堆栈(Stack)与堆(Heap)是两种非常重要的内存管理机制,它们各自有着独特的特性和应用场景。堆栈的名词解释主要是为了帮助大家增进对这两种数据结构的理解。 #### 二、堆栈的定义及特点 ####...

    C-C++中堆栈的区别

    堆和栈的主要区别在于: 1. 分配方式:栈由编译器自动分配和释放,而堆需要程序员手动分配和释放。 2. 内存大小:栈的大小有限,通常较小;堆的大小取决于可用的虚拟内存,相对较大。 3. 分配效率:栈的分配速度较...

    关于堆栈的详细介绍

    通过对堆栈的基本概念及其在数据结构与程序内存管理两个维度的深入探讨,我们不仅了解了堆栈各自的特点和应用场景,还掌握了它们之间的主要区别。对于C/C++程序员而言,深入理解这些概念有助于提高编程效率,避免...

    操作系统中的堆栈的经典解释

    本文将深入探讨操作系统层面的堆栈概念及其区别,并结合具体的代码实例进行说明。 #### 一、基本概念 **1. 堆栈(Stack)** - **定义**: 堆栈是一种后进先出(Last In First Out, LIFO)的数据结构,在内存中表现...

    内存中堆和栈的区别

    内存中堆和栈的区别 内存中堆和栈是两个不同的概念,都是用来存放数据的内存区域,但它们有所区别。 内存分配方面 堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收。堆的分配方式类似于链表...

Global site tag (gtag.js) - Google Analytics