元空间 是用于存储类元数据的内存区域,元类是在解析
.class文件时创建的内部JVM结构。
类元数据包括:
- Java类的内部表示
- 具有字节码的方法
- 字段描述符
- 恒定池
- 符号
- 注解
- 等等
-XX:MaxmetaspaceSize默认情况下是无限的。
当
-XX:+UseCompressedClassPointersoption为ON(堆<32G的默认设置)时,类将从metaspace移到称为
Compressed Class Space 的单独区域。这是为了使用32位值而不是64位来寻址VM类结构。
因此,压缩类空间包含Java类的内部表示形式,而元空间则包含所有其余的元数据:方法,常量池,注释等。
压缩类空间的大小受限制
-XX:CompressedClassSpaceSize,默认情况下为1G。的最大可能值为
-XX:CompressedClassSpaceSize3G。
非类元空间和压缩类空间是两个不相交的区域。
MaxmetaspaceSize限制两个区域的承诺大小:
committed(Non-class metaspace) + committed(Compressed Class Space) <= MaxmetaspaceSize
如果
MaxmetaspaceSize设置为小于
CompressedClassSpaceSize,则后者会自动减小为
CompressedClassSpaceSize = MaxmetaspaceSize - 2*InitialBootClassLoadermetaspaceSize



