J. *_*ith 17 java linux jvm java-8 metaspace
在Java 8堆打印输出中,您可能会看到如下所示的行:
Metaspace 使用 2425K,容量 4498K,承诺 4864K,保留 1056768K
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html尝试解释该行:
在以Metaspace开头的行中,使用的值是用于加载类的空间量.该容量值可用于当前分配块的元数据的空间.该承诺值的可用空间块的数量.的保留值是用于元数据的空间保留(但不一定提交)的量.
再次,从上面的链接:
从操作系统请求空间,然后分成块.类加载器从其块中为元数据分配空间(块绑定到特定的类加载器).
我想知道每个字段的含义(使用,容量,承诺,保留),但我很难理解上面的定义.
我的理解是,元空间是从JVM进程的虚拟地址空间中划分出来的.JVM在启动时保留初始大小,基于-XX:MetaspaceSize,它具有未记录的,特定于平台的默认值.我假设保留是指元空间的总大小.空间分为块.我不确定每个块是否具有相同的大小.每个块包含与单个类加载器关联的类元数据.
容量和承诺的声音对我来说就像是免费空间(基于链接的定义).由于元数据存储在块中,因此我假设使用的+容量将等于已提交,但事实并非如此.也许承诺意味着使用的保留空间,但那么使用的意思是什么?元数据使用的空间?那么,还有什么方法可以使用这个空间?
我希望你看到我的困惑.我希望澄清这些定义.
apa*_*gin 36
元空间由一个或多个虚拟空间组成.虚拟空间是从OS获得的连续地址空间区域.它们按需分配.分配时,Virtual Space会从操作系统中保留内存,但尚未提交.元空间预留内存是所有虚拟空间的总大小.
虚拟空间内的分配单元是Metachunk(或简称为Chunk).从虚拟空间分配新块时,将提交相应的内存.元空间提交的内存是所有块的总大小.
块可能大小不同.当ClassLoader被垃圾收集时,属于它的所有Metachunk都被释放.全局免费列表中保留了免费块.元空间容量是所有已分配(即非自由)块的总大小.
新的块分配
类元数据在块中分配.块可能不包含来自多个ClassLoader的数据,但是一个ClassLoader可能包含多个块.元空间中使用是从所有组块的所有类的元数据的总大小.
| 归档时间: |
|
| 查看次数: |
4531 次 |
| 最近记录: |