欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[JVM] GC日志中的Metaspace

程序员文章站 2022-07-12 20:09:13
...

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

Metaspace被分为了4个部分,分别是usedcapacitycommittedreserved,同时还多了一个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.

*中对于这个部分的解释

*

[JVM] GC日志中的Metaspace

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