堆栈产生于内存中.
堆:存储的是引用的数据类型,引用的数据类型不能限制大小,比如class.
堆实际上是一个在内存中使用内存中的零散空间的链表结构的存储空间
堆的大小由引用类型的大小直接决定,应用类型的大小的变化直接影响堆的变化.
栈:
栈是内存中存储值类型的,大小为2M,如果超出 则会报错 :内存溢出.
堆栈的特色:
先进后出,最顶层的为栈顶元素. 俩个动作:入栈 -出栈
入栈有个push()的方法 出栈则有个pop()的方法
入栈调用的时候相当于增加-对象
出栈调用的时候相当于删除或弹出 每次执行先弹出栈顶元素(-次)
新名词:压栈:每次新进入的一个元素,都是压在它上一个元素之上,所以叫压栈.
不同点
1、栈先进后出、在栈顶做插入删除操作。堆和栈不同,不存在先进后出。
2、一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。
3、堆内存用于存放由new创建的对象和数组。
4、数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
栈的原理图