一、JVM 内存区域划分
JVM(Java 虚拟机)仿照真实操作系统设计,对进程地址空间进行了区域划分。主要包含四个核心区域:
- 程序计数器:记录当前指令执行地址。
- 元数据区:保存类加载后的数据(.class 文件),Java 8 前称为方法区。
- 栈:保存方法调用关系。
- 堆:保存 new 的对象。例如
Test t = new Test(),new Test()在堆中,局部变量 t 在栈,成员变量 t 在堆,静态成员变量 t 在元数据区。

二、类加载机制
2.1 类加载的步骤
- 加载:根据全限定名找到 .class 文件,读取内容到内存。
- 连接:
- 验证:校验 .class 文件合法性并转为结构化数据。
- 准备:为类对象申请内存空间(初始化为 0)。
- 解析:将字符串常量放入元数据区的常量池中。
- 初始化:执行类对象的初始化代码。
2.2 双亲委派模型
描述类加载器查找 .class 文件的过程。JVM 默认提供三种类加载器(存在父子关系):
BootstrapClassLoader:负责 Java 标准库。ExtensionClassLoader:负责 Java 扩展库。ApplicationClassLoader:负责第三方库和当前项目。
过程:从 ApplicationClassLoader 开始,依次委托给父亲 ExtensionClassLoader 和 BootstrapClassLoader。若父加载器未找到,则抛回给子加载器尝试;若最终都未找到,抛出异常。

三、垃圾回收机制 (GC)
Java 自动管理堆内存释放。相比 C 语言手动释放,Java 通过 GC 自动识别并回收不再使用的内存。
工作过程
-
找到垃圾:
- 引用计数:对象引用数为 0 时视为垃圾。缺陷:消耗内存且无法解决循环引用。
- 可达性分析:以栈上局部变量、常量池引用、静态成员为起点遍历,未被标记的对象即为垃圾。Java 采用此方案。
-
释放垃圾:
- 标记 - 清除:直接释放,产生内存碎片。
- 复制算法:内存一分为二,存活对象复制到另一半,原址释放。缺点:利用率低。
- 标记 - 整理:存活对象向前移动,尾部释放。缺点:搬运成本高。
- 分代回收:结合上述策略,区分新生代和老年代。



