Java 17中jcmd VM.native_memory的Class与Metaspace区别解析
答案
一、Class和Metaspace段的区别
- 统计范围不同:
Class是对所有类相关内存开销的整体统计,涵盖类元数据、类空间,以及类加载过程中临时分配的malloc内存,是个更宽泛的分类,包含所有和类定义、加载相关的内存使用。Metaspace专门统计元数据区的内存,也就是存储类元数据(类结构、方法、字段等信息)的核心区域,是Class下属Metadata的核心对应,再加上少量临时malloc内存。
- 组成细节不同:
Class段包含类数量统计(实例类、数组类的数量)、malloc临时内存、mmap分配内存,以及Metadata和Class space两个子模块。Metaspace只包含malloc内存和mmap分配内存,没有类数量、类空间的相关统计。
二、Class下的Metadata与Metaspace的关系
二者不完全等同,但核心内存区域重叠:
- 从示例的mmap数据可以看到:
Class下Metadata的reserved=262144KB和committed=257280KB,和Metaspace段的mmap数据完全一致,说明Metaspace的核心内存就是Class下的Metadata区域。 - 但
Metaspace还额外包含了1612KB的malloc内存(示例中标注为峰值),这是元数据区运行时临时分配的小内存块,而Class下的Metadata只统计了mmap分配的内存。所以整体上,Metaspace是Class下Metadata加上少量临时malloc内存的总和。
内容的提问来源于stack exchange,提问作者tuk
相关产品推荐
相关产品推荐

