👌什么是JVM方法区?

👌什么是JVM方法区?

题目详细答案

JVM 方法区是 JVM 运行时数据区的一部分,用于存储与类和方法相关的元数据。它是所有线程共享的内存区域,包含了 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等。方法区的内容在 JVM 启动时创建,并在 JVM 运行期间动态扩展或收缩。

方法区的主要内容

1
2
3
4
5
6
7
8
+-----------------------------+
| 方法区 (Method Area) |
| - 类信息 |
| - 运行时常量池 |
| - 静态变量 |
| - 即时编译器编译后的代码 |
| - 字段和方法信息 |
+-----------------------------+
  1. 类信息:包括类名、父类名、访问修饰符、接口列表等的元数据。
  2. 运行时常量池:存储编译期生成的各种字面量和符号引用,这些引用在类加载后被解析为直接引用。
  3. 静态变量:类的静态字段,存储类级别的变量。
  4. 即时编译器编译后的代码:即时编译器(JIT)将热点代码编译为本地机器码,存储在方法区中。
  5. 字段和方法信息:包括字段描述、方法描述、方法字节码、方法的访问修饰符等。

方法区在不同 JVM 实现中的差异

HotSpot JVM(Java 7 及之前):方法区实现为永久代(Permanent Generation,PermGen)。永久代的内存空间固定,容易导致内存溢出(OutOfMemoryError)。

HotSpot JVM(Java 8 及之后):方法区实现为元空间(Metaspace)。元空间使用本地内存(Native Memory),默认情况下可以根据需要动态扩展,减少了内存溢出的风险。

方法区的内存管理

方法区的内存管理主要包括以下几个方面:

  1. 类加载:当一个类被加载时,其相关信息会被存储在方法区中。
  2. 类卸载:当一个类不再被使用且没有任何引用时,垃圾收集器可以回收方法区中的类元数据。
  3. 垃圾收集:方法区的垃圾收集主要针对废弃的类元数据和常量池中的无用常量。相比堆内存的垃圾收集,方法区的垃圾收集频率较低。
 wechat
天生我才必有用