简单理解(包含GC Garbage Collector)

8 堆和栈.mp4 (12.77MB)

一块堆内存什么时候会被GC?

当这款内存被引用的数为0的时候。

Stack

  • 空间比较小,读取速度快
  • 先进后出,只能在栈顶操作(删除,添加)

image.png

如何理解“栈”?

关于“栈”,我有一个非常贴切的例子,就是一摞叠在一起的盘子。我们平时放盘子的时候,都是从下往上一个一个放;取的时候,我们也是从上往下一个一个地依次取,不能从中间任意抽出。
image.png

从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。

内存中的堆栈和数据结构堆栈不是一个概念

可以说内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象的数据存储结构。

内存空间在逻辑上分为三部分:

代码区、静态数据区和动态数据区,动态数据区又分为栈区和堆区。
代码区:存储方法体的二进制代码。高级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)控制代码区执行代码的切换。
静态数据区:存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系统自动分配和回收。
栈区:存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。
堆区:new一个对象的引用或地址存储在栈区,指向该对象存储在堆区中的真实数据。