面试题答案
一键面试Memcached的Slab Allocation内存分配机制基本原理
- Slab Class划分:
- Memcached将内存空间划分成多个Slab Class,每个Slab Class包含一系列大小相等的Chunk。不同的Slab Class中Chunk的大小不同,比如从较小的固定大小到较大的固定大小,例如80字节、160字节、320字节等不同规格。
- 这种划分方式使得Memcached可以根据存储数据的大小选择合适的Slab Class来存储,提高内存使用效率。
- 内存分配流程:
- 当需要存储数据时,Memcached会根据数据的大小,找到能容纳该数据的最小Chunk的Slab Class。
- 然后从该Slab Class的空闲Chunk列表中取出一个Chunk来存储数据。如果该Slab Class中没有空闲Chunk,则会申请新的Page(由多个Chunk组成)并划分成Chunk添加到该Slab Class的空闲列表。
- 内存回收:
- 当数据从Memcached中删除时,对应的Chunk会被标记为空闲,重新加入到所属Slab Class的空闲Chunk列表中,供后续存储使用。
解决内存碎片化问题的方式
- 固定大小Chunk:通过使用固定大小的Chunk存储数据,避免了像传统动态内存分配那样因为不同大小数据的频繁分配和释放导致的内存碎片化。因为每个Chunk都是固定大小,无论存储何种数据,其占用内存的边界都是清晰且固定的,不会产生无法利用的小碎片空间。
- Slab Class独立管理:每个Slab Class独立管理自己的Chunk,不同Slab Class之间的内存使用互不干扰。即使某个Slab Class内出现Chunk的频繁分配和释放,也不会影响其他Slab Class的内存布局,进一步限制了内存碎片化的范围,使得内存碎片化问题仅在单个Slab Class内部存在,而不会蔓延到整个内存空间。