GC日志中的Metaspace

参考文章: ​​java面试:你真的知道metaspace??​​ 参考文章: 理解JVM堆中Metaspace的输出

在GC日志中,有这么一段

Metaspace       used 2652K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 286K, capacity 386K, committed 512K, reserved 1048576K
12

Metaspace被分为了4个部分,分别是​​used​​​、​​capacity​​​、​​committed​​​、​​reserved​​,同时还多了一个class space,同样被分为了这4个部分

对于这个,Oracle官网给出了解释

​Oracle文档​​ In the line beginning with Metaspace, the used value is the amount of space used for loaded classes. The capacity value is the space available for metadata in currently allocated chunks. The committed value is the amount of space available for chunks. The reserved value is the amount of space reserved (but not necessarily committed) for metadata. The line beginning with class space line contains the corresponding values for the metadata for compressed class pointers.

StackOverFlow中对于这个部分的解释

​Stackoverflow​

[JVM] GC日志中的Metaspace_sed

Metasapce由多个​​虚拟空间​​​组成,虚拟空间就是系统中的一些连续的内存空间,它们按需分配。分配时,虚拟空间从系统中保留内存,但是还没有提交,Metaspace中的​​reserved​​就是所有的虚拟空间总和

虚拟空间中的分配单元是一个一个的​​meta chunk​​​,当一个新的chunk从虚拟空间中被分配时,它所相关连的内存也被提交,Metaspace中的​​committed​​就是所有的chunk总和

新的chunk的内存分配

  • 在空闲列表中寻找已存在的空闲chunk
  • 如果没有找到合适的chunk,那么会在当前的虚拟空间中重新分配一个
  • 如果当前的虚拟空间中已经没有内存可用了,那么会​​reserve:预定​​一个新的虚拟空间

类元数据被分配在一个个的chunk中,一个chunk可能不会包含多个classloader,但是一个classloader可能会横跨多个chunk,Metaspace中的​​used​​就是所有的包含了类元数据信息的chunk

Metaspace中的​​capacity​​​就是已经分配内存的chunk总和,包括没有被​​used​​的