元空间是存放在堆中的吗?会OOM吗?触发GC机制是啥? 📅 2026/7/25 12:32:39 这个问题问得很精准,直接触及了JVM内存模型的一个关键变化。答案是:元空间(Metaspace)并不存放在堆(Heap)中,它使用的是本地内存(Native Memory),也就是操作系统直接管理的内存。📍 元空间的内存位置在Java 8之前,类的元数据(如类的结构、方法信息、常量池等)存放在永久代(PermGen)中,而永久代是堆的一部分。这就导致了一个经典问题:永久代的大小固定(可通过-XX:MaxPermSize设置),当应用动态生成大量类(如使用Spring、CGLIB时)很容易引发java.lang.OutOfMemoryError: PermGen space。从Java 8开始,永久代被彻底移除,取而代之的是元空间(Metaspace)。元空间不再使用JVM堆内存,而是直接向操作系统申请本地内存。堆(Heap):存放对象实例,受-Xmx和-Xms控制。元空间(Metaspace):存放类的元数据,受-XX:MaxMetaspaceSize控制(默认无上限,会动态扩展,受限于物理内存)。🔍 为什么要移到本地内存?将元数据从堆移到本地内存,核心原因有几个:解决永久代的内存溢出问题:永久代的大小在启动时固定,很难调优。元空间默认无上限,除非设置-XX:MaxMetaspaceSize,否则它会根据需要自动增长,大大减少了因类加载导致的内存溢出。更合理的垃圾回收:永久代的GC效率很低,且需要配合Fu