请介绍 JVM 内存模型,说明它分为哪些区域,以及每个区域的作用。
考察说明
考查对 JVM 运行时数据区划分及各自职责的理解。
回答思路
- 【回答框架 1】JVM 内存模型指运行时数据区,按线程共享与私有划分。线程共享区包括堆和方法区,线程私有区包括虚拟机栈、本地方法栈和程序计数器。
- 【回答框架 2】堆是最大区域,存放对象实例和数组,是 GC 主要管理区域,可细分为新生代和老年代,逻辑上可压缩。
- 【回答框架 3】方法区存储类元信息、常量、静态变量和 JIT 缓存,JDK8 后由元空间实现,使用本地内存,受操作系统限制。
- 【回答框架 4】虚拟机栈是线程私有的,每个方法调用创建一个栈帧,内部有局部变量表、操作数栈、动态链接和返回地址,局部变量表存放基本类型和引用。
- 【回答框架 5】程序计数器记录当前线程执行的字节码行号,是唯一无 OOM 的区域;本地方法栈用于执行 native 方法。
- 【关键点 1】JVM 内存区域分为线程共享的堆和方法区,以及线程私有的虚拟机栈、本地方法栈和程序计数器。
- 【关键点 2】堆是对象分配和 GC 的主要区域,方法区在 JDK8 后由元空间实现。
- 【关键点 3】虚拟机栈以栈帧为单位,每个方法调用对应一个栈帧。
- 【易错点 1】不要混淆 JVM 内存模型与 Java 内存模型,后者关注并发可见性。
- 【易错点 2】方法区是逻辑概念,JDK8 后实现为元空间,不再是永久代。
- 【易错点 3】程序计数器是唯一不会抛出 OutOfMemoryError 的区域。