方法区(Method Area)是JVM内存结构的一部分,用于存储类结构、常量、静态变量等数据。它对应于JVM规范中的Runtime Constant Pool。
方法区主要存储以下数据:
- 类的结构:包括字段描述、方法描述等。
- 常量池:存放编译期生成的各种字面量和符号引用。
- 静态变量:非静态类变量的初始化值。
- JIT编译后生成的代码:如接口方法等。
- 对象的类型信息:用于对象运行时的类型判断。
方法区与Java堆的区别是:
- 方法区存储的数据是共享的,堆存储的数据是每个对象私有的。
- 方法区存储的数据是存活时间比较长的,堆存储的数据存活时间较短。
- 方法区由JVM维护的,堆由程序员维护。
- 方法区空间是否足够是JVM要考虑的,堆空间是否足够由程序员决定。
来看一个简单例子:
public class MethodAreaDemo {
public static void main(String[] args) {
// 类的结构信息放入方法区
MethodAreaDemo demo = new MethodAreaDemo();
// 常量放入方法区的常量池
String s = "Hello";
// 静态变量放入方法区
static int count = 0;
}
}
可以看到,方法区存储了类的结构信息、常量池中的常量“Hello”,以及静态变量count。