堆与栈

合集下载

栈、堆、方法区的交互关系

栈、堆、方法区的交互关系

栈、堆、方法区的交互关系

首先,栈内存用于存储方法的局部变量、形参和方法调用的状态信息。当一个方法被调用时,Java虚拟机会在栈内存中为该方法创建一个栈帧,用于存储方法的局部变量、形参等信息。当方法执行完毕后,该栈帧会被销毁。

其次,堆内存用于存储Java对象和数组。当一个对象被创建时,Java虚拟机会在堆内存中为该对象分配一块内存空间,用于存储对象的实例变量。对象的引用则存储在栈内存中。当没有任何引用指向该对象时,该对象所占用的堆内存空间会被垃圾回收器回收。

最后,方法区用于存储被虚拟机加载的类信息、常量池、静态变量等。常量池以及类信息存储在方法区的运行时常量池中,静态变量则存储在方法区中的静态变量区域。当一个类被加载时,Java虚拟机会在方法区中为该类创建一个Class对象,用于存储该类的信息。

综上所述,栈、堆、方法区三者之间是相互交互的,它们协同工作,保证Java程序的顺利执行。

- 1 -

什么是堆栈

什么是堆栈

什么是堆栈

在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。

堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。

要点:

堆:顺序随意

栈:后进先出(Last-In/First-Out)

堆和栈的区别

一、预备知识—程序的内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束后由系统释放。

4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。

5、程序代码区—存放函数体的二进制代码。

二、例子程序

这是一个前辈写的,非常详细

//main.cpp

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()

{

int b; 栈

char s[] = "abc"; 栈

char *p2; 栈

char *p3 = "123456"; 123456\0在常量区,p3在栈上。

static int c =0;全局(静态)初始化区

p1 = (char *)malloc(10);

课题_C语言堆栈入门——堆和栈的区别

课题_C语言堆栈入门——堆和栈的区别

C语言堆栈入门——堆和栈的区别在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。

但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运

行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中

的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不

清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝

赐教,这对于大家学习会有很大帮助。

首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。

堆和栈都是一种数据项按序排列的数据结构。

我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说

后存放的先取,先存放的后取。这就如同我们要取出放在箱子里面底下的东西(放入的比较

早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。而堆就不同了,堆

是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是

指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于

堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取

书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的

书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。

然而我要说的重点并不在这,我要说的堆和栈并不是数据结构的堆和栈,之所以要说数

据结构的堆和栈是为了和后面我要说的堆区和栈区区别开来,请大家一定要注意。

数据结构 堆和栈的区别

数据结构 堆和栈的区别

数据结构堆和栈的区别

堆和栈是数据结构中常见的两种存储方式,它们在内存分配、存储方式、访问

方式等方面有着明显的区别。下面将详细介绍堆和栈的区别。

1. 内存分配方式:

- 栈:栈是由编译器自动分配和释放内存的,它的大小和生命周期都是确定的。栈中存储的数据是按照后进先出(LIFO)的原则进行管理。

- 堆:堆是由程序员手动分配和释放内存的,它的大小和生命周期可以动态

地调整。堆中存储的数据没有特定的顺序,可以随时访问。

2. 存储方式:

- 栈:栈中存储的数据是以相邻的内存地址顺序存放的,每个数据占用的内

存空间大小是固定的。栈的存取速度较快,因为它使用的是硬件支持的指令,不需要进行额外的内存管理。

- 堆:堆中存储的数据是以链表的形式存放的,每个数据占用的内存空间大

小可以不同。堆的存取速度较慢,因为它需要进行内存管理,包括分配和释放内存。

3. 访问方式:

- 栈:栈中的数据是按照先进后出的顺序访问的,只能访问栈顶的数据。栈

的访问速度较快,因为它使用的是硬件支持的指令。

- 堆:堆中的数据可以通过指针进行随机访问,可以访问任意位置的数据。

堆的访问速度较慢,因为它需要通过指针进行间接访问。

4. 生命周期:

- 栈:栈中的数据的生命周期是由编译器自动管理的,当函数执行结束时,

栈中的数据会被自动释放。栈中的数据不能被跨函数访问。

- 堆:堆中的数据的生命周期是由程序员手动管理的,需要显式地分配和释

放内存。堆中的数据可以被多个函数共享访问。

5. 内存管理:

- 栈:栈的内存管理是由编译器自动完成的,不需要程序员手动管理。栈中

堆数组和栈数组

堆数组和栈数组

在计算机科学中,"堆数组"和"栈数组"通常指的是数据结构中的两种不同类型的数组。

1. 堆数组(Heap Array):

堆数组通常指的是在动态内存(堆)中分配的数组。这种数组的大小在运行时可以动态地分配和调整,因此可以根据需要动态增长或缩小。在C++中,可以使用new和delete关键字来分配和释放堆数组。在Java等语言中,可以使用类似ArrayList和Vector的动态数组来实现堆数组。

2. 栈数组(Stack Array):

栈数组是指在栈上分配的数组,大小在编译时就确定了。这意味着栈数组的大小是固定的,无法在运行时改变。栈数组通常用于实现静态数据结构,如固定大小的数组或者作为函数中的局部变量。在C++中,可以使用静态数组或者std::array来实现栈数组。

总的来说,堆数组和栈数组的主要区别在于它们的内存分配方式和大小的灵活性。堆数组具有动态分配内存的特性,可以在运行时动态调整大小,而栈数组则是在编译时确定大小并分配在栈上的固定大小数组。

.net中堆和栈的区别(图文解释)

.net中堆和栈的区别(图文解释)

尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection),但是我们还是应该了解它们,以优化我们的应用程序。同时,还需要具备一些基础的内存管理工作机制的知识,这样能够有助于解释我们日常程序编写中的变量的行为。在本文中我将讲解栈和堆的基本知识,变量类型以及为什么一些变量能够按照它们自己的方式工作。

在.NET framework环境下,当我们的代码执行时,内存中尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection),但是我们还是应该了解它们,以优化我们的应用程序。同时,还需要具备一些基础的内存管理工作机制的知识,这样能够有助于解释我们日常程序编写中的变量的行为。在本文中我将讲解栈和堆的基本知识,变量类型以及为什么一些变量能够按照它们自己的方式工作。

在.NET framework环境下,当我们的代码执行时,内存中有两个地方用来存储这些代码。假如你不曾了解,那就让我来给你介绍栈(Stack)和堆(Heap)。栈和堆都用来帮助我们运行代码的,它们驻留在机器内存中,且包含所有代码执行所需要的信息。

* 栈vs堆:有什么不同?

栈负责保存我们的代码执行(或调用)路径,而堆则负责保存对象(或者说数据,接下来将谈到很多关于堆的问题)的路径。

可以将栈想象成一堆从顶向下堆叠的盒子。当每调用一次方法时,我们将应用程序中所要发生的事情记录在栈顶的一个盒子中,而我们每次只能够使用栈顶的那个盒子。当我们栈顶的盒子被使用完之后,或者说方法执行完毕之后,我们将抛开这个盒子然后继续使用栈顶上的新盒子。堆的工作原理比较相似,但大多数时候堆用作保存信息而非保存执行路径,因此堆能够在任意时间被访问。与栈相比堆没有任何访问限制,堆就像床上的旧衣服,我们并没有花时间去整理,那是因为可以随时找到一件我们需要的衣服,而栈就像储物柜里堆叠的鞋盒,我们只能从最顶层的盒子开始取,直到发现那只合适的。

操作系统中的堆与栈

操作系统中的堆与栈

操作系统中的堆与栈

1>系统的响应

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,在使用完毕后才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

2>大小的限制

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是一个编译时就确定的常数,如果申请的空间超过栈的剩余空间时,将提示overflow,即栈溢出。因此,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得空间的方式比较灵活,可分配的空间也较大。

3>申请效率的比较

栈:由系统自动分配,速度很快。但程序员无法控制。

堆:是由new分配的内存,一般速度较慢,而且容易产生内存碎片,不过使用起来最为方便。

4>堆和栈中的存储内容

栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

堆栈的概念

堆栈的概念

在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。

堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。

要点:

堆:顺序随意

栈:后进先出(Last-In/First-Out)

编辑本段堆和栈的区别

一、预备知识—程序的内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束后由系统释放。

4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。

5、程序代码区—存放函数体的二进制代码。

二、例子程序

这是一个前辈写的,非常详细

//main.cpp

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()

{

int b; 栈

char s[] = "abc"; 栈

char *p2; 栈

char *p3 = "123456"; 123456\0在常量区,p3在栈上。

static int c =0;全局(静态)初始化区

p1 = (char *)malloc(10);

C语言堆栈入门堆和栈的区别

C语言堆栈入门堆和栈的区别

C语言堆栈入门堆和栈

的区别

集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN]

2010年1月29日 C语言堆栈入门——堆和栈的区别原文:

/link.php?url=http://www.top-

/jiaoshi/html/427.html

在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助。

数据结构的栈和堆

首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。

堆和栈都是把一些数据项按序排列的数据结构。

我们先从大家比较熟悉的栈说起吧:

栈就像装数据的桶或箱子,它是一种具有“后进先出”性质的数据结构,也就是说后存放的先取,先存放的后取。这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体当然就压在底下了,),我们首先要移开压在它上面的物体(放入的比较晚的物体)。

堆像一棵倒过来的树

而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。

堆和栈,malloc分配的空间是堆,局部变量都在栈中

堆和栈,malloc分配的空间是堆,局部变量都在栈中

堆和栈,malloc分配的空间是堆,局部变量都在栈中堆和栈的区别

⼀个由C/C++编译的程序占⽤的内存分为以下⼏个部分

1、栈区(stack)— 由编译器⾃动分配释放,存放函数的参数值,局部变量的值等。其

操作⽅式类似于数据结构中的栈。

2、堆区(heap) — ⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回

收。注意它与数据结构中的堆是两回事,分配⽅式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在⼀块的,初始化的

全局变量和静态变量在⼀块区域,未初始化的全局变量和未初始化的静态变量在相邻的另

⼀块区域。 - 程序结束后由系统释放。

4、⽂字常量区 —常量字符串就是放在这⾥的。程序结束后由系统释放

5、程序代码区—存放函数体的⼆进制代码。

例⼦:

#include <stdio.h>

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()

{

int b; 栈

char s[] = "abc"; 栈

char *p2; 栈

char *p3 = "123456"; 123456\0在常量区,p3在栈上。

static int c =0;全局(静态)初始化区

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

//分配得来得10和20字节的区域就在堆区。

strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成⼀个地⽅。

C语言堆和栈的区别

C语言堆和栈的区别

堆和栈的区别

一、预备知识—程序的内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

二、例子程序

这是一个前辈写的,非常详细

//main.cpp

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()

{

int b; 栈

char s[] = "abc"; 栈

char *p2; 栈

char *p3 = "123456"; 123456\0在常量区,p3在栈上。

static int c =0;全局(静态)初始化区

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

分配得来得10和20字节的区域就在堆区。

strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

}

二、堆和栈的理论知识

2.1申请方式

计算机技术之堆与栈的详细介绍

计算机技术之堆与栈的详细介绍

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

stack 和heep都是内存的一部分

stack 空间小,速度比较快,用来放对象的引用

heep大,一般所有创建的对象都放在这里。

栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量.

在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域). 堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),C中的malloc语句所产生的内存空间就在堆中.

在java中,所有使用new xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象.所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用.

1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见

第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

3. Java中的数据类型有两种。

一种是基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是,自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。

堆和栈的区别之数据结构和内存

堆和栈的区别之数据结构和内存

堆和栈的区别之数据结构和内存

数据结构的栈和堆

⾸先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。

堆和栈都是⼀种数据项按序排列的数据结构。

栈就像装数据的桶或箱⼦

我们先从⼤家⽐较熟悉的栈说起吧,它是⼀种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。

这就如同我们要取出放在箱⼦⾥⾯底下的东西(放⼊的⽐较早的物体),我们⾸先要移开压在它上⾯的物体(放⼊的⽐较晚的物体)。

堆像⼀棵倒过来的树

⽽堆就不同了,堆是⼀种经过排序的树形数据结构,每个结点都有⼀个值。

通常我们所说的堆的数据结构,是指⼆叉堆。

堆的特点是根结点的值最⼩(或最⼤),且根结点的两个⼦树也是⼀个堆。

由于堆的这个特性,常⽤来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意⼀本时不必像栈⼀样,先取出前⾯所有的书,书架这种机制不同于箱⼦,我们可以直接取出我们想要的书。

内存分配中的栈和堆

先看百度百科中的内存堆栈介绍:

堆栈空间分配

栈(操作系统):由操作系统⾃动分配释放,存放函数的参数值,局部变量的值等。其操作⽅式类似于数据结构中的栈。

堆(操作系统):⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配⽅式倒是类似于链表。

堆栈缓存⽅式

栈使⽤的是⼀级缓存,他们通常都是被调⽤时处于存储空间中,调⽤完毕⽴即释放。

堆则是存放在⼆级缓存中,⽣命周期由虚拟机的垃圾回收算法来决定(并不是⼀旦成为孤⼉对象就能被回收)。所以调⽤这些对象的速度要相对来得低⼀些。

内存中的栈,堆和方法区的用法

内存中的栈,堆和方法区的用法

内存中的栈,堆和方法区的用法

一、栈的用法

1. 栈是一种线性数据结构,具有“先进后出”(FILO)的特点,通常

用于保存方法的调用信息、局部变量等。栈的大小是固定的,在程序

运行时分配,在方法调用时创建,方法调用结束时销毁。

2. 在Java中,每个线程都拥有自己的栈,栈中保存了方法的调用信息、局部变量等。当一个方法被调用时,会在栈中创建一个新的栈帧用于

保存该方法的调用信息和局部变量,并将该栈帧压入到栈顶。当方法

执行结束时,会将该方法的栈帧从栈顶弹出,释放栈空间。

3. 栈的大小在编译时就已经确定,一般为几十至几百KB,由虚拟机参数-Xss来控制。

二、堆的用法

1. 堆是用于存储对象实例的内存区域,具有动态分配和回收的特点。

堆的大小是可变的,在程序运行时分配,通过垃圾回收机制来进行自

动回收。

2. 在Java中,所有的对象实例都存储在堆中,通过new关键字创建

的对象实例都存储在堆中。堆的大小在程序运行时可以动态调整,通

过虚拟机参数-Xms和-Xmx来控制初始堆大小和最大堆大小。

3. 堆的回收由垃圾回收器(GC)来负责,不同的垃圾回收器有不同的回收策略,如串行回收器、并行回收器、CMS回收器、G1回收器等。

三、方法区的用法

1. 方法区是堆的一部分,用于存储类信息、常量池、静态变量等。方法区的大小是固定的,在程序运行时分配,由虚拟机参数-

XX:MaxMetaspaceSize来控制。

2. 在Java 8之前,方法区中存储着类的元数据信息,包括类的结构信息、字段信息、方法信息等。在Java 8及之后,方法区被元空间(Metaspace)所代替,元空间是直接使用本地内存存储类的元数据信息,不再受限于方法区的大小。

堆和栈的概念和区别

堆和栈的概念和区别

堆和栈的概念和区别

堆栈空间分配

栈(操作系统):由操作系统⾃动分配释放,存放函数的,的值等。其操作⽅式类似于数据结构中的栈。

堆(操作系统):⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配⽅式倒是类似于链表

堆栈缓存⽅式

栈使⽤的是,他们通常都是被调⽤时处于存储空间中,调⽤完毕⽴即释放。

堆则是存放在中,⽣命周期由虚拟机的垃圾回收算法来决定(并不是⼀旦成为孤⼉对象就能被回收)。所以调⽤这些对象的速度要相对来得低⼀些。

堆栈数据结构区别

堆(数据结构):堆可以被看成是⼀棵树,如:堆排序。先进先出

栈(数据结构):⼀种先进后出的数据结构。

例如:顺序栈AStack的类定义

template < class T >

class AStack {

private:

int size ; // 数组的规模

T * stackArray ; // 存放堆栈元素的数组

int top ; // 栈顶所在数组元素的下标

public:

AStack ( int MaxStackSize ) // 构造函数

{ size = MaxStackSize ; stackArray = new T [MaxStackSize] ; top = -1 ; }

~AStack ( ) { delete [ ] stackArray ; } // 析构函数

bool Push ( const T& item ) ; // 向栈顶压⼊⼀个元素

bool Pop ( T & item ) ; // 从栈顶弹出⼀个元素

bool Peek ( T & item ) const ; // 存取栈顶元素

Heap和Stack的区别

Heap和Stack的区别

Heap和Stack的区别

我的答案:

1.栈是⽤来存放基本类型的变量和引⽤类型的变量,堆⽤来存放new出来的对象和数组。

2.栈的存取速度快,但不灵活。堆的存取速度慢,但是存取灵活,空间动态分配。

3.栈在建⽴在连续的物理位置上,⽽堆只需要逻辑位置连续即可。

4.堆是JVM运⾏时最⼤的内存区域。

巨佬的答案:

Java的内存分为两类,⼀类是栈内存,⼀类是堆内存。栈内存是指程序进⼊⼀个⽅法时,会为这个⽅法单独分配⼀块私属存储空间,⽤于存储这个⽅法内部的局部变量,当这个⽅法结束时,分配给这个⽅法的栈会释放,这个栈中的变量也将随之释放。

堆是与栈作⽤不同的内存,⼀般⽤于存放不放在当前⽅法栈中的那些数据,例如,使⽤new创建的对象都放在堆⾥,所以,它不会随⽅法的结束⽽消失。⽅法中的局部变量使⽤final修饰后,放在堆中,⽽不是栈中。

1.heap是堆,stack是栈。

2.stack的空间由操作系统⾃动分配和释放,heap的空间是⼿动申请和释放的,heap常⽤new 关键字来分配。

3.stack空间有限,heap的空间是很⼤的⾃由区。

在Java中,

若只是声明⼀个对象,则先在栈内存中为其分配地址空间,

若再new⼀下,实例化它,则在堆内存中为其分配地址。

4.举例:

数据类型变量名;这样定义的东西在栈区。

如:Object a =null; 只在栈内存中分配空间

new 数据类型();或者malloc(长度); 这样定义的东西就在堆区

如:Object b =new Object(); 则在堆内存中分配空间

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

栈是由编译器在需要的时分配的,不需要时自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。堆是有malloc()函数(C++语言为new运算符)分配为内存快,内存的释放由程序员手动控制,在C语言为free()完成(C++中为deleted)。堆和栈的主要区别有以下几点:

(1)管理方式不同

栈编译器自动管理,无需程序员手工控制;而堆空间的申请释放工作由程序员控制,容易产生内存泄漏。

(2)空间的大小不同

栈是向低地址扩展的数据结构,是一块连续的内存区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先设定好,当申请的空间超过栈的剩余空间时,将提示溢出。因此,用户能从栈获得空间较小。

堆是向高地址扩展的数据结构,是不连续的内存区域。因为系统是用链表来存储空闲内存地址的,且链表的遍历方向是由低地址向高地址。由此可见,堆获得空间较灵活,也较大。栈中元素都是一一对应的,不会存在一个内存块从中弹出的情况。

(3)是否产生碎片

对于栈来讲,频繁的malloc/free(new/delete)势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低(虽然程序在退出后操作系统会对内存进行回收管理)。对于栈来讲,则不会存在这个问题。

(4) 增长方向不同

堆的增长方向是向上的,即向着内存地址增加的方向。栈的增长方向是向下的,即向着内存地址减小的方向。

(5)分配方式不同

堆都是程序中由malloc()函数动态申请分配并由free()函数释放的;栈的分配和释放是由编译器完成的,栈的动态分配由alloca()函数完成,但是栈的动态分配和对不同,它的动态分配是由编译器进行申请和释放的,无需手工实现。

(6)分配效率不同

栈是由机器系统提供的数据结构,计算机会在底层对栈提供支持;分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令进行。堆则是C函数库提供的,它的机制很复杂,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大的空间,如果没有足够大的空间(可能是由于内存碎片太多),就需要操作系统来重新整理内存空间,这样就有机会分到足够大小的内存,然后返回。

显然堆的效率要比栈低得多。

可执行代码运行时内存结构结构:

(1)代码区(text segment)。代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需要借助栈来实现。

代码区的指令包括操作码和要操作的对象(或对象地址引用)。如果是里技术(及具体的数值),将直接包含在代码中;如果是局部变量,将在栈区分配空间。然后引用该数的地址;如果是BSS去和数据区,在代码中同样是引用该数的地址。

(2)全局初始化数据区/静态数据区(Data Segment)。只初始化一次。

(3)未初始化数据区(BBS)。在运行时改变其值,存入的全局未初始化变量。例如一个不在任何函数内的声明:long sum[1000];

(4)栈区(stack)。由编译器自动分配释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。每当一个函数被调用,该函数返回地址和一些关于调用的信息,比如某些寄存器的内容改变,被存储对哦栈区。然后这个被调用的函数再为它的自动变量和临时变量在栈区上分配空间,这就是C 实现递归函数的方法。每执行依次函数递归函数调用,一个新的栈框架就会被使用,这样这个新实例栈里的变量就不会和该函数的另一个实例栈里面的变量混淆。

(5)堆区(heap)用于动态内存分配。堆在内存中位于bss区和栈区之间。一般由程序员分配和释放,若程序员不释放,结束程序时有可能由OS回收。

可执行代码存储结构

可执行代码在存储时分为代码区(text),数据区(data)和未初始化数据区(bss)。

相关文档
最新文档