在 Java 8 堆打印输出中,您可能会看到如下所示的一行:
元空间已用2425K ,容量4498K,已提交4864K,保留1056768K
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html试图解释这一行:
在以 Metaspace 开头的行中,使用的值是用于加载的类的空间量。容量值是当前分配的块中可用于元数据的空间。提交的值是可用于块的空间量。保留值是为元数据保留(但不一定提交)的空间量。
同样,从上面的链接:
从操作系统请求空间,然后分成块。类加载器从其块中为元数据分配空间(块绑定到特定的类加载器)。
我想知道每个字段的含义(已使用、容量、已提交、保留),但我很难理解上述定义。
我的理解是元空间是从 JVM 进程的虚拟地址空间中分割出来的。JVM 在启动时根据 -XX:MetaspaceSize 保留初始大小,该大小具有未记录的特定于平台的默认值。我假设reserved是指元空间的总大小。空间被分成块。我不确定每个块是否具有相同的大小。每个块包含与单个类加载器关联的类元数据。
容量和承诺对我来说听起来像是可用空间(基于链接中的定义)。由于元数据存储在块中,所以我假设已用 + 容量将等于已提交,但事实并非如此。也许已提交意味着已使用的保留空间,但是使用的意思是什么?元数据使用的空间?那么,还有什么其他方式可以利用空间呢?
我希望你能看到我的困惑。我希望澄清定义。