目录
基础概念
JAVA在程序运行时,在内存中划分5片空间进行数据的存储。
分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆
栈解决程序的运行问题,即程序如何执行,或者说如何处理数据
堆解决的是数据存储的问题,即数据怎么放,放在哪儿
所以说,栈是运行时的单位 , 而堆是存储的单元
Java自动管理栈和堆,程序员不能直接地设置栈或堆
JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈
也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的
堆栈以帧为单位保存线程的状态,JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作
栈中的数据
函数中定义的基本类型变量, 共有8种,即int, short, long, byte, float, double, boolean, char(注意,没有string)
对象的引用变量,局部变量(定义在函数中的变量、定义在函数中的参数上的变量、定义在for循环内部的变量)
都在函数的栈内存中分配,数数据一执行完毕,变量会立即释放,节约内存空间
栈内存中的数据,没有默认初始化值,需要手动设置
栈有一个很重要的特殊性,就是存在栈中的数据可以共享
FILO先进后出,暂存数据的地方。每个线程都包含一个栈区!栈存放在一级缓存中,存取速度较快
栈是限定仅在表头进行插入和删除操作的线性表
堆中的数据
new创建的实例化对象及数组,是存放在堆内存中的,堆中数据不共享,只能有一个引用对象
堆内存中所有的实体都有内存地址值,实体是用来封装数据的,这些数据都有默认初始化值
当用完之后即实体不再被指向时,JVM启动垃圾回收机制不定期自动消除
FIFO队列优先,先进先出。jvm只有一个堆区被所有线程所共享
堆存放在二级缓存中,创建和销毁都要消耗更长的时间,所以速度相对慢一些
堆栈的优缺点
堆的优点:编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间
即可以动态的分配内存大小,生命周期不确定,因此,用堆保存数据时会得到更大的灵活性
堆的缺点:堆里分配存储空间时会花掉更长的时间,速度慢,效率低
堆不象栈是连续的空间,没有办法指望堆本身的内存分配能够象堆栈一样拥有传送带般的速度
栈的优点:由于栈是从栈顶向上用就行,就好像工厂中的传送带一样,Stack Pointer会自动指引你到放东西的位置
你所要做的只是把东西放下来就行.退出函数的时候,修改栈指针就可以把栈中的内容销毁.这样的模式速度最快
栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短
栈的缺点:栈中的数据大小和生命周期必须是明确的,缺少灵活性
堆栈溢出原因
栈溢出:
- 是否有递归调用
- 全局变量是否过多
- 数组、List、map数据是否过大
- 指针或数组越界
堆溢出:
- 动态申请空间使用之后没有释放
- 不断创建新的对象