一、JVM 内存区域划分
JVM(Java 虚拟机)借鉴真实操作系统的进程地址空间设计进行了区域划分。
具体划分为四个核心区域:
- 程序计数器:一个很小的区域,只用来记录当前指令执行到哪个地址。
- 元数据区:保存当前类被加载好的数据(类对象 .class),Java 8 之前叫方法区。
- 栈:保存方法的调用关系。
- 堆:保存 new 的对象。例如代码
Test t = new Test()中,new Test()一定在堆中;t是局部变量则在栈;若t是成员变量则在堆;若t是静态成员变量则关联于元数据区。

二、类加载机制
2.1 类加载的步骤
类加载主要包含以下步骤:
- 加载:找到 .class 文件,根据类的全限定名(包名 + 类名),打开文件,读取内容到内存中。
- 连接:
- 验证:校验 .class 文件的内容是否合法,并将合法内容转成结构化的数据。
- 准备:给类对象申请内存空间(此处相当于全 0 的空间)。
- 解析:针对字符串常量进行初始化,将 .class 文件解析出的字符串常量放到元数据区的常量池中。
- 初始化:将类对象进行初始化。
2.2 双亲委派模型
双亲委派模型描述了类加载中根据全限定类名查找 .class 文件的过程。
类加载器是 JVM 中专门的模块,负责类加载。JVM 默认提供三种类加载器(存在父子关系):
BootstrapClassLoader:负责查找 Java 标准库的目录。ExtensionClassLoader:负责查找 Java 扩展库的目录。ApplicationClassLoader:负责查找第三方库和当前项目的目录。
加载过程:
- 进行类加载时,通过全限定类名找 .class 文件,先从
ApplicationClassLoader作为入口,然后把加载任务交给父亲ExtensionClassLoader,它再交给父亲BootstrapClassLoader。 BootstrapClassLoader查找 Java 标准库范围,找到了就加载,没找到就抛回给儿子ExtensionClassLoader,同理进行。- 最后
ApplicationClassLoader都没找到,就抛出异常。




