JVM的元空间(Metaspace)是Java虚拟机中用于存储类元数据的空间。在Java 7及更早版本中,HotSpot JVM使用永久代(PermGen space)来存放类的元信息、静态变量、常量池以及方法字节码等。然而,永久代的设计带来了一些问题,比如对永久代大小的管理不灵活且容易导致内存溢出错误(OOM: PermGen)。

从Java 8开始,Oracle HotSpot JVM移除了永久代,并引入了元空间的概念。元空间位于Java堆之外的本地内存区域(Native Heap),这意味着它不再受制于堆大小的限制。元空间主要用于存储类的结构信息,如运行时常量池、字段和方法数据、类加载器引用等。当类加载到JVM时,相关的元数据就会被保存在元空间内。

相比于永久代,元空间有以下几个特点:

  • 元空间的大小并不固定,而是可以动态调整,如果元空间不足,会触发完全垃圾回收(Full GC),并在必要时扩展其大小,直至达到 -XX:MaxMetaspaceSize 设置的最大值。
  • 类卸载时,对应的元数据也会被清理掉,从而释放元空间资源。
  • 因为不在堆上,所以不影响常规堆空间的使用与配置。

通过合理设置元空间相关的参数,可以更好地管理类的加载和卸载,减少由于类元数据占用空间而导致的问题。