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

Metaspace由一个或多个虚拟空间组成。虚拟空间是从操作系统获得的连续地址空间的区域。它们按需分配。当分配时,Virtual从操作系统中保留内存,但尚未提交。Metaspace 保留的内存是所有虚拟空间的总大小。
虚拟空间中的分配单元是元块(或简单的块)。当从Virtual分配一个新块时,相应的内存将被提交。Metaspace 提交的内存是所有块的总大小。
块的大小可能不同。当ClassLoader被垃圾收集时,属于它的所有元块都会被释放。空闲块在全局空闲列表中维护。Metaspace 容量是所有已分配(即非空闲)块的总大小。
新块分配
类元数据在块内分配。块可能不包含来自多个ClassLoaders的数据,但一个ClassLoader可能包含多个块。Metaspace 使用的是来自所有块的所有类元数据的总大小。
https://stackoverflow.com/questions/40891433
复制相似问题