【重难点总结】第四章 JVM
文章目录
一、JVM 体系结构
1.运行时数据区
运行时数据区是 JVM 在执行 Java 程序时用于存储各种数据的内存区域。它包括:
方法区
方法区是所有线程共享的内存区域,用于存储已被 JVM 加载的类信息、常量、静态变量、即时编译后的代码等。方法区由元空间实现,元空间使用本地内存,在 JVM 之外,由操作系统管理。
方法区存储类的名称、方法信息、字段信息等。
堆
堆是所有线程共享的内存区域,用于存放新创建的对象实例和数组。堆是垃圾收集器主要管理的区域,通常分为两个部分:
- 新生代:用于存放新创建的对象,通常进一步划分为 Eden 区和两个 Survivor 区
- 老年代:用于存放生命周期较长的对象
JVM 栈
每个线程都有一个私有的 JVM 栈,用于存储方法的局部变量、操作数栈、方法出口信息等。每调用一个方法,就会在 JVM 栈中创建一个栈帧
- 局部变量表:存储方法参数和局部变量
- 操作数栈:用于执行字节码指令时,临时存放操作数
- 帧数据:博爱阔方法的返回地址和其他信息
本地方法栈
本地方法栈与 JVM 栈类似,但它为本地方法(如 C、C++ 代码)服务。每个线程都有一个私有的本地方法栈,当调用本地方法时,本地方法栈用于存储局部变量和其他方法信息
程序计数器
程序计数器是每个线程私有的,存储当前线程所执行的字节码指令地址。如果线程正在执行的是本地方法,则程序计数器为空
直接内存
直接内存不属于 JVM 运行时数据区的一部分,是本地内存的一部分,由 Java NIO 库使用,用于直接访问对外内存。直接内存的分配和释放由操作系统管理
2.执行引擎
执行引擎负责执行字节码,包括:
- 解释器:逐行解释执行字节码。解释执行速度较慢,但启动快
- 即时i编译器:将热点代码编译为机器码,提高执行速度
- 垃圾收集器:自动管理堆内存,回收不再使用的对象
3.本地方法接口
本地方法接口(JNI)允许 Java 调用本地代码(如 C、C++ 编写的库)。JNI 提供了一组 API,用于实现 Java 与本地代码之间的交互
二、类加载机制
1.类加载过程概述
主要阶段:
- 加载
- 链接
- 验证
- 准备
- 解析
- 初始化