Java 虚拟机我们简称为 JVM(Java Virtual Machine)。
Java 虚拟机在执行 Java 程序的过程中,会管理几个不同的数据区域。如下图所示:
下面我会介绍这几个数据区的特点。
堆
堆区的几个特点:
- 线程共享。
- 启动时创建堆这个区。
- 基本上所有的对象实例都在这个区分配。
- 物理上不连接(大对象除外)。逻辑上不连接。
- 内存分为新生代和老年代。新生代分为 eden 区和两个大小一样的 survivor 区。
内存细分:
Java 7 及之前内存逻辑上分为三部分:新生区 + 老年代 + 永久代。
- 新生区,又被划分为 Eden 区和 Survivor 区。
- 老年代。
- 永久代实现了方法区。
Java 8 及之后内存逻辑上分为三部分:新生区 + 老年代 + 元空间。
- 新生区,又被划分为 Eden 区和 Survivor 区。
- 老年代。
- 废弃了永久代,使用元空间,它属于本地内存。
方法区
- 线程共享。
- 主要存储这几类信息。
- 类型信息。
- 常量。
- 静态变量。
- 即时编译器编译后的代码缓存。
虚拟机栈
- 线程私有。
- 生命周期与线程相同。
- 一个线程中,每一个方法被执行的时候,创建一个栈帧。
- 栈帧 Stack Frame 的结构。
- 存储局部变量表。
- 基本数据类型。
- 存储局部变量表。