GC日志中的Metaspace
参考文章: java面试:你真的知道metaspace?? 参考文章: 理解JVM堆中Metaspace的输出
在GC日志中,有这么一段
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中对于这个部分的解释
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
的