整体结构图
Virtualspace
+- Committed: 已提交的空间, 会被划分成一个个MetaChunk
| +- Took: 已经被划分成MetaChunk的空间
| | +- MetaChunk in Used: 一个被使用的MetaChunk
| | | +- Head: MetaChunk头部, 64位上占40个字节
| | | +- Metaspace Object: 分配在Metaspace中的对象, 对象类型在下文介绍
| | | +- Private Free Block: 可重复利用的Block, 但是只能被关联的ClassLoaderData所使用
| | | +- Unusable Block: 暂时无法重新利用的Block, 只有等到ClassLoaderData能被回收才会释放
| | | +- Wait To Free Object: 分配在Metaspace中的对象, 已经可以被回收了, 但是还未被回收
| | | \- Private Free: MetaChunk中剩余的空间, 只能被关联的ClassLoaderData所使用
| | \- MetaChunk in Global Free List: 空闲的MetaChunk, 所有ClassLoaderData都能获取
| \- Global Free: 还能继续被划分成MetaChunk的空间, 全局共享
\- Uncomitted: 未被提交的空间, 无法使用
碎片化问题
MetaChunk 会导致碎片化问题
参考:
1、ATA文章:https://ata.atatech.org/articles/11000102553?layout=%2Fvelocity%2Flayout%2Fblank.vm