CompressedClassSpaceSize区域是否包含MaxMetaspaceSize区域?

时间:2019-01-18 09:05:23

标签: java jvm

什么是CompressedClassSpaceSize

CompressedClassSpaceSizeMetaspaceSize之间是什么关系?

1 个答案:

答案 0 :(得分:5)

元空间是用于存储类元数据的存储区,该元数据是在解析.class文件时创建的内部JVM结构。

类元数据包括:

  • Java类的内部表示形式
  • 带有字节码的方法
  • 字段描述符
  • 恒定池
  • 符号
  • 注释

-XX:MaxMetaspaceSize默认不受限制。

-XX:+UseCompressedClassPointers选项为ON(堆<32G的默认设置)时,类从Metaspace移到名为 Compressed Class Space 的单独区域。这是为了使用32位值而不是64位来寻址VM类结构。

因此,压缩类空间包含Java类的内部表示形式,而元空间则包含所有其余的元数据:方法,常量池,注释等。

压缩类空间的大小受-XX:CompressedClassSpaceSize的限制,默认情况下为1G。 -XX:CompressedClassSpaceSize的最大可能值为3G。

非类元空间和压缩类空间是两个不相交的区域。 MaxMetaspaceSize限制了两个区域的承诺大小:

committed(Non-class Metaspace) + committed(Compressed Class Space) <= MaxMetaspaceSize

如果将MaxMetaspaceSize设置为小于CompressedClassSpaceSize,则后者会自动减小为

CompressedClassSpaceSize = MaxMetaspaceSize - 2*InitialBootClassLoaderMetaspaceSize