Java Memory Metaspace

作用范围

  Metaspace 元数据区,JDK8 后出现用于替代 Perm 区。

相关参数

  Metaspace 主要参数有 2 个,分别介绍一下:

  • -XX:MetaspaceSize

    元数据空间初始大小

  • -XX:MaxMetaspaceSize

    最大元数据空间大小

使用案例

  • -XX:MetaspaceSize=256M 代表元数据空间初始大小为 256M。

  • -XX:MaxMetaspaceSize=512M 代表元数据空大最大大小为 512M。

参数默认值

   以下为默认值均为 Linux 平台下的默认值。

参数 默认值 JDK 版本
-XX:MetaspaceSize 21807104 jdk1.8
-XX:MaxMetaspaceSize 18446744073709547520 jdk1.8

注意事项

  • JDK8 开始,JVM 启动时会专门分配一块内存,大小是 CompressedClassSpaceSize,正常情况下会类似 Perm 一样挨着 Heap 分配,这块内存专门来存储类元数据 Klass 部分。

  • 如果未开启 UseCompressedClassPointers,哪怕设置了 CompressedClassSpaceSize 参数也没有效果。

  • InitialBootClassLoaderMetaspaceSize 主要指定 BootstrapClassLoader 的存储非 Klass 部分的数据的第一个 Metachunk 大小,64 位默下默认 4M,32 位下默认 2200K,而存储 Klass 部分的数据的第一个 Metachunk 的大小默认在 384K 左右。

  • Metaspace 如果类加载器很多的时候,最大的问题就是碎片化的问题。

  • jstat 看到的 Metaspace 内存使用率可能是不准确的,因为分母是 committed 的 size,而不是整个 Reserved 的内存。

  • JDK8 之前使用 Perm 来存储类信息,如果空间不足会抛出 OOM,为了解决 JDK8 使用 Metaspace 代替 Perm,通过堆外内存来解决该问题。

实践问题

  • 如果 MetaspaceSize 比 MaxMetaspaceSize 大会怎么样?

    程序报错,无法启动 JVM。

    $ java -XX:MetapsaceSize=256M -XX:MaxMetaspaceSize=128M Test
    Unrecognized VM option 'MetapsaceSize=256M'
    Error: Could not create the Java Virtual Machine.
    Error: A fatal exception has occurred. Program will exit.
  • 如果 MaxMetaspaceSize 比 Xmx 大会怎么样?

    正常启动,因为 MetaspaceSize 使用的是堆外内存。

      $ java -Xmx1000M -XX:MaxMetaspaceSize=1024M Test


Java     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!