Skip to main content

方法区

所有 Java 虚拟机线程共享该方法区。它存储每个类的结构, 例如运行时常量池、字段和方法数据,以及方法和构造函数的代码,类元数据

静态变量逻辑上属于方法区,但在物理上是属于堆的

类元数据

简单来说,类元数据就是 JVM 运行一个类所需要的全部“说明书”。

当你编写一个 User.java 并编译成 User.class 后,JVM 把这个文件加载到内存中,解析出来的信息就叫类元数据。它主要包含以下内容:

① 类的基本信息 (Class Structure)

魔数与版本号: 确认这个 class 文件能否被当前 JVM 执行。

类名、父类名、实现的接口名: 确定类的继承关系。

访问修饰符: 是 public 还是 private,是 abstract 还是 final。

② 字段元数据 (Field Metadata)

类中定义了哪些成员变量?

变量的名字、类型、访问修饰符是什么?

(注意:这里存的是字段的定义,而不是静态变量的具体值)。

③ 方法元数据 (Method Metadata)

方法名、返回类型、参数列表。

字节码 (Bytecode): 这是最占地方的部分,即方法内部的具体逻辑代码。

异常表 (Exception Table): 遇到什么异常跳到哪一行。

操作数栈和局部变量表的大小: 告诉 JVM 运行这个方法需要多大的栈帧。

④ 运行时常量池 (Runtime Constant Pool)

这是类元数据的“索引表”。

比如代码里调用了 System.out.println(),在类元数据里存的就是对 System 类、out 字段和 println 方法的符号引用。