栈(FILO:先进后出)
栈的优缺点
- 优点: 存取速度比堆要快,仅次于CPU中的寄存器,栈数据可以共享
- 缺点: 存在栈中的数据大小与生存期必须是确定的,缺乏灵活性
栈中存储的数据有哪些?
- mian方法
- 基本类型变量
- 引用类型变量
- 方法函数句柄
存储过程
- 当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间
- 当该变量超过它的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用
特点
- 超过它本身的作用域后,会自动释放掉,为该变量分配的内存空间
- 栈是先进后出的原则
堆(队列 - FIFO:先进先出)
堆的优缺点
- 优点: 可以动态地分配内存大小,生存期也不必事先告诉编译器
- 缺点: 由于要在运行时动态分配内存,存取速度较慢
堆中存储的数据有哪些?
-
堆中存储的数据是引用类型数据变量所指向的内存空间
-
存储的是对象的数据
-
左侧 date : 是在栈内存中开辟一块引用地址,这里存储着 变量 date 和 对应它在堆中储存空间的内存地址
-
右侧 new Date() : 在date指向的堆内存空间存储关于Date对象的数据
存储过程
例如: Date date;
- Date date : 首先会在栈内存中开辟一特殊的变量,以<K,V>结构储存
- K: 是变量名,以便java引用; V: 数组或者对象在堆内存中的首地址
- K属于V的一个别名,或者代号,通过K可以找到V
date = new Date();
4. 数组或对象本身的数据是在堆中分配
5. 当程序运行超出new Date()的作用于外,对象本身占用的堆内存也不会被释放
6. 如果对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存
7. 随后的一个不确定的时间被垃圾回收器释放掉
8. 这个也是java比较占内存的主要原因
9. 实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
特点
- 在堆中分配的内存,由java虚拟机自动垃圾回收器来管理
- 堆是先进先出的原则