从metaspace系列-metaspace初识中我们知道Metaspace这个类定义了几个属性,这几个属性其实是三对,因为Metaspace里面包含了两类数据,分别是类相关的元数据和非类相关的元数据,从下图截取src/share/vm/memory/Metaspace.hpp的源码图可以看出来元数据分为两种。接下来我们挨个看看所有的属性
SpaceManager
SpaceManager是用来给Metaspace管理内存的。
关注几个属性
属性名称 | 属性作用 |
---|---|
Metaspace::MetadataType _mdtype; | Metadata的类型,分为类相关Metadata和非类相关Metadata |
Metachunk* _chunks_in_use[NumberOfInUseLists]; | 当前SpaceManager中正在被使用的chunk的列表,这个在SpaceManager被回收的时候可以用来快速定位到那些chunk应该被回收 |
size_t _allocated_blocks_words; | 所有block所占的内存大小 |
size_t _allocated_chunks_words; | 所有chunk所占的内存大小 |
BlockFreelist _block_freelists; | 空闲的chunk列表,这里面的chunk再分配时会被重新使用 |
allocate
上面是SpaceManager的allocate的方法,这里需要注意的是分配的时候不是直接就从_block_freelists这个空闲列表中分配,因为从空闲列表直接分配的话,他需要遍历找到一个合适大小的,而遍历的成本比较高,所以他只当空闲列表变大的时候,也就是到达4K的时候才会从空闲列表中分配
retire_current_chunk
我们从图中可以看到对于当前chunk,如果他的剩余空间不够分配到新的block,而且他的空间大于min_size的话,他会把这块空间放到block_freelists空闲列表中
析构函数
ChunkManager
// Manages the global free lists of chunks.
ChunkManager是用来全局管理chunk空闲列表的
_free_chunks
ChunkManager中的_free_chunks是用来管理所有的空闲chunk的,SpaceManager中的 _block _freelist是用来管理所有空闲的block的。
这里的_free_chunks是一个ChunkList链表的数组,NumberOfInUseLists为4,因为Chunk总共分为四类,四类
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。