heap与stack的区别

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(); 则在堆内存中分配空间

时间: 2024-12-30 09:03:03

heap与stack的区别的相关文章

heap和stack的区别?

1.申请方式 stack:由系统自动分配.例如,声明在函数中一个局部变量 int b; 系统自动在栈中为 b 开辟空间 heap:需要程序员自己申请,并指明大小,在 c 中 malloc 函数,对于 Java 需要手动 new Object()的形式开辟 2.申请后系统的响应 stack:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出. heap:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆

【转】heap与stack的区别

堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念.首先,这两个概念都可以在讲数据结构的书中找到,他们都是基本的数据结构,虽然栈更为简单一些. 在具体的C/C++编程框架中,这两个概念并不是并行的.对底层机器代码的研究可以揭示,栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的. 栈和堆其实有两种理解: 其一,纯粹的数据结构的理解:栈是一种先进后出的线性表,只要符合先进后出的原则的线性表都是栈,采用数组还是链表来实现线性表是没关系的.堆则是二叉树的一种,有所谓最

转载C#中堆(heap)和栈(stack)的区别

转载原地址  http://www.cnblogs.com/wangshenhe/archive/2013/02/18/2916275.html [转]C#堆和栈的区别 理解堆与栈对于理解.NET中的内存管理.垃圾回收.错误和异常.调试与日志有很大的帮助.垃圾回收的机制使程序员从复杂的内存管理中解脱出来,虽然绝大多数的C#程序并不需要程序员手动管理内存,但这并不代表程序员就无需了解分配的对象是如何被回收的,在一些特殊的场合仍需要程序员手动进行内存管理. 在32位的处理器上,每个进程的虚拟内存为4

每日一问2:堆(heap)和栈(stack)的区别

因为这里没有明确指出堆是指数据结构还是存储方式,所以两个尝试都回答一下. 一.堆和栈作为数据结构 1.堆(heap),也叫做优先队列(priority queue),队列中允许的操作是先进先出(FIFO),在队尾插入元素,在队头取出元素.而堆也是一样,在堆底插入元素,在堆顶取出元素,但是堆中元素的排列不是按照到来的先后顺序,而是按照一定的优先顺序排列的.这个优先顺序可以是元素的大小或者其他规则. 2.栈(stack),是一种运算受限的线性表,栈中允许的操作时先进后出(FILO),在栈顶插入元素,

heap&stack的区别

1. heap (堆)是一个可动态申请的内存空间,一般所有创建的对象和数组都放在这里.stack (栈)是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量.stack (栈)的空间小,但速度比较快, 存放对象的引用,通过栈中的地址索引可以找到堆中的对象. 2. stack的空间由操作系统自动分配和释放, heap的空间是手动申请和释放的,heap常用new关键字来分配. stack空间有限,heap的空间是很大的自由区. 在Java中, 若只是声明一个对象,则先在栈内存中为其分

heap 和 stack 有什么区别

Java 的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法 时,会为这个方法单独分配一块私属存 储空间,用于存储这个方法内部的局部变量,当这个 方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释 放. 堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new 创建的对象都放在堆里,所 以,它不会随方法的结束而消失.方法中的局部变量使用 final 修饰后,放在堆中,而不是栈中. 原文地址:https://www.cnblogs.com/

Java里的堆(heap)栈(stack)和方法区(method)

基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量 . 方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后从栈空间回收.局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收. 方法调用时传入的 literal 参数,先在栈空间分配,在方法调用完成后从栈空间分配.

Heap and Stack

2.1 内存分配策略按照编译原理的观点,程序运行时的内存分配有3种策略,分别是(1)静态(2)栈式(3)堆式(1)静态存储分配:编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计准确的存储空间需求.(2)栈式存储分配(也称动态存储分配):由一个类似于堆栈的运行栈来实现的.与静态存储分配相反,在栈式存储方案中,程序对数据

Java Heap and Stack

Heap(堆)(FIFO): heap是一个运行时数据区, 类的对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放.堆是由垃圾回收(GC)来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要在运行时动态分配内存,存取速度较慢. Stack(栈)(FILO): Stack的存取速度比he