堆和栈的区别有以下几方面:1、申请方式的不同;2、申请大小的不同;3、申请效率的不同;4、存储内容的不同;5、底层不同。申请方式的不同是指栈由系统自动分配,而堆是人为申请开辟。
1、申请方式的不同。栈由系统自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。而堆是由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
2、申请大小的不同。栈获得的空间较小,而堆获得的空间较大;
3、申请效率的不同。栈由系统自动分配,速度较快,而堆一般速度比较慢;
4、存储内容的不同。栈在函数调用时,函数调用语句的下一条可执行语句的地址名列前茅个进栈,然后函数的各个参数进栈,其中静态变量是不入栈的。而堆一般是在头部用一个字节存放堆的大小,堆中的具体内容是人为安排;
5、底层不同。栈是连续的空间,而堆是不连续的空间。
栈
栈是由操作系统自动分配释放的。存储的都是局部变量,栈先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。
堆
堆由程序员分配释放, 若不释放,会被当作垃圾,Java中有垃圾回收机制会不定时自动收取(可能会在程序结束时就会被回收),分配方式倒是类似于链表。存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的。
延伸阅读
栈内存
方法调用, 进到栈内存中占有空间运行, 方法运行完毕, 弹出栈内存, 释放空间
堆内存
引用数据类型通过new关键字开辟空间, 创建对象, 需要在堆内存中占有空间
内存区域类型
1、寄存器:非常快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制
2、静态域:存放静态成员(static定义的)
3、常量池:字符串常量和基本类型常量(public static final)。有时,在嵌入式系统中,常量本身会和其他部分分割离开(由于版权等其他原因),所以在这种情况下,可以选择将其放在ROM中
4、非RAM存储:硬盘等永久存储空间
文章标题:堆和栈的区别是什么,发布者:小编,转载请注明出处:https://worktile.com/kb/p/38687