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