方法区
所有 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 方法的符号引用。