首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解JVM堆打印输出中的metaspace行

理解JVM堆打印输出中的metaspace行
EN

Stack Overflow用户
提问于 2016-11-30 14:54:16
回答 1查看 10.3K关注 0票数 22

在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、提交的听起来像是空闲空间(基于链接中的定义)。由于元数据存储在块中,那么我假设使用的+容量等于提交,但它不是。也许提交意味着保留所使用的空间,但是使用意味着什么呢?元数据使用的空间?那么,还有什么其他的方法来使用这个空间呢?

我希望你能看到我的困惑。我希望对这些定义作出澄清。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-30 23:15:44

Metaspace由一个或多个虚拟空间组成。虚拟空间是从操作系统获得的连续地址空间的区域。它们按需分配。当分配时,Virtual从操作系统中保留内存,但尚未提交。Metaspace 保留的内存是所有虚拟空间的总大小。

虚拟空间中的分配单元是元块(或简单的块)。当从Virtual分配一个新块时,相应的内存将被提交。Metaspace 提交的内存是所有块的总大小。

块的大小可能不同。当ClassLoader被垃圾收集时,属于它的所有元块都会被释放。空闲块在全局空闲列表中维护。Metaspace 容量是所有已分配(即非空闲)块的总大小。

新块分配

  1. 在空闲列表中寻找一个现有的空闲块。
  2. 如果没有合适的空闲块,则从当前的虚拟空间中分配一个新的块。
  3. 如果当前虚拟空间已耗尽,请保留一个新的虚拟空间。

类元数据在块内分配。块可能不包含来自多个ClassLoaders的数据,但一个ClassLoader可能包含多个块。Metaspace 使用的是来自所有块的所有类元数据的总大小。

票数 53
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40891433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档