CompressedClassSpaceSize区域是否包含MaxMetaspaceSize区域?

sto*_*one 2 java jvm

什么CompressedClassSpaceSize

CompressedClassSpaceSize和之间是什么关系MetaspaceSize

apa*_*gin 9

元空间是用于存储类元数据的内存区域,元类是在解析.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
Run Code Online (Sandbox Code Playgroud)

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

CompressedClassSpaceSize = MaxMetaspaceSize - 2*InitialBootClassLoaderMetaspaceSize
Run Code Online (Sandbox Code Playgroud)