在JVM的内存结构中,方法区(Method Area)被视为JVM的永久代。它主要负责存储已经被虚拟机加载的类信息、常量、静态变量以及编译器编译后的代码等数据。具体可以分为以下几个部分:
类信息
这部分信息包括类数据(如类名、访问修饰符等)、父类和接口信息、内部类信息等。这些信息在类被加载到JVM时就已经确定,并且在类的整个生命周期中保持不变。
常量池
每一个类或接口在JVM中都有一个常量池。常量池存储两类常量:字面量(如文本字符串、被声明为final的常量值)和符号引用(如类或接口的全限定名、字段的名称、方法的名称和描述符等)。
字段和方法数据
这部分数据包括字段和方法的信息,包括字段和方法的名称、描述符(用于确定方法的参数和返回值)、访问修饰符、操作码实现方法体逻辑的字节码内容等。
类变量(静态变量)
类变量也称为静态变量,它们属于类,与该类的任何对象无关。这意味着所有实例都将共享该静态变量。我们可以在没有创建类的实例的情况下访问静态变量。
运行时常量池
它是方法区的一部分。Class文件中除了有类的版本信息、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用。
以上就是存储在方法区的主要信息。需要注意的是,方法区虽然被称为“永久代”,但这并不意味着它的内存是不会被回收的——当某个类变得不再被需要时(即:所有的实例都不再存在,且Java虚拟机认为它不会再被使用),GC会回收这个类在方法区内的内存。