什么是元空间?它的作用是什么?代码举例讲解

元空间(Metaspace)是JDK 8引入的,用来替代永久代。它的主要作用是存储类加载器及类信息(如类的元数据)等数据。

元空间的作用是:

  1. 存储类加载器及定义在方法区的类型信息,替代永久代。
  2. 元空间位于本地堆内存,不在Java堆内存管理下,避免PermGen空间不足引起的Full GC。
  3. 元空间的大小仅受本地堆内存限制,默认无最大值限制。
  4. 我们可以使用-XX:MaxMetaspaceSize来设置元空间最大值。
  5. 类卸载不会使元空间大小减小,这需要重启JVM。

和永久代相比,元空间具有以下优点:

  1. 不会引起Full GC,避免 PermGen空间不足引起的GC停顿。
  2. 大小Flexible,可扩展到本地堆内存上限。
  3. 适用于动态生成大量短暂类的场景。

我们来看一个简单示例:

public class MetaSpaceDemo {
    public static void main(String[] args) {
        for (int i = 0; i < 100000; i++) {   // 构建10w个class
            new MetaSpaceClass();
        }
    }
}  

class MetaSpaceClass {}

运行该示例不会抛出OOM,这是因为元空间大小很大,足以容纳10w个类信息。
如果我们配置:

-XX:MaxMetaspaceSize=10M

然后运行,程序同样不会抛出OOM,这是因为元空间不会引起Full GC。
所以,理解元空间可以让我们更好的判断类信息在内存中的分配和管理。