元空间是Java 8中替代永久代的本地内存区域,专存类元数据;它使用操作系统本地内存、不占JVM堆空间,动态伸缩且默认无上限,以类加载器为单位分配和回收内存块,其垃圾回收依赖类加载器生命周期。

元空间是JVM在Java 8中替代永久代(PermGen)的内存区域,专用于存储类的元数据,它的内存特性与传统堆内区域有本质区别。
使用本地内存(off-heap),不占JVM堆空间
元空间的数据不分配在Java堆中,而是直接使用操作系统的本地内存(Native Memory)。这意味着它不受-Xmx、-Xms等堆参数限制,也不会参与堆内存的分配与GC调度。类加载器加载类时,其元数据(如类名、字段、方法字节码、常量池引用等)全部落在本地内存里,由操作系统统一管理。
大小动态伸缩,默认无上限
元空间初始只按需分配少量内存(由-XX:MetaspaceSize控制,默认约20–24MB),之后随类加载持续增长;若未显式设置最大值,它会一直扩展直到耗尽系统可用内存。这种弹性避免了PermGen时代因固定大小导致的OutOfMemoryError: PermGen space,但也带来新风险:不设-XX:MaxMetaspaceSize可能导致JVM吃光系统物理内存或触发OOMKiller杀进程。
以类加载器为单位组织内存块
每个类加载器拥有独立的元空间内存块链表(Metaspace Chunk List)。当该加载器加载新类而当前块不足时,JVM向OS申请新的chunk(大小可为16KB/512KB/4MB等,依需求分级)。这种结构使卸载类加载器时能整体回收其所有元数据——只要该加载器本身被GC判定为不可达,其所占元空间内存就能被批量释放,无需逐个扫描类对象。
垃圾回收依赖类加载器生命周期
元空间本身不触发GC,但它的回收与Full GC或元空间专用GC(如G1中的Metaspace GC)联动。只有当某个类加载器被回收,且其所加载的所有Class对象也都不再被引用时,JVM才在下次元空间GC周期中清理对应chunk。因此,类加载器泄漏(如Web应用热部署未清理旧loader)会直接导致元空间持续增长直至OOM。

















