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