OC是程序中最基本的存储单位,包括变量名,变量类型和作用域;
堆栈主要功能是暂时存放数据和地址;
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
特征:先进后出;
运算:运算受限的线性表,只允许在表的一端进行插入和删除操作
过程:向一个栈插入新元素称为入栈,删除一个元素称为出栈或退栈
例: 栈S为(a,b,c),字符c为栈顶元素,若向S压入一个元素d
则S变为(a,b,c,d)d变为栈顶元素,若直接删除2个元素,则首先删除元素d,再删除元素c,栈为(a,b)栈顶元素为b
栈内存:基本类型的变量。 和 对象的引用变量 都是在函数的栈内存中分配;
释放:
当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间
特征:
存取速度比堆要快,仅次于寄存器,栈数据可以共享
存在栈中的数据大小与生存期必须是确定的,缺乏灵活性
堆
一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
堆内存:
用于存放由new创建的对象。 和 数组,内存的分配由Java虚拟机的自动垃圾回收器来管理
释放:
数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走
特点:
动态地分配内存大小,生存期也不必事先告诉编译器
在运行时动态分配内存,存取速度较慢
总:从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的
静态存储分配:
指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间
特征:确定的存储空间
代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现
队列、堆、栈:
队列是先进先出:
栈:只是指一种使用堆的方法(即先进后出)。
堆:动态分配内存
String
String str = new String("abc");----(1)
String str = "abc";------(2)
分析:1.第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
2. 是先在栈中创建一个对String类 的 变量str,然后通过符号去字符串常量池 里找有没有"abc",
如果没有,则将"abc"存放进字符串常量池 ,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共 享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要 在运行时动态分配内存,存取速度较慢。