操作系统中剩余的空间总量是足够的,但是当请求一个N字节的连续地址块时,剩余的内存空间中没有大小为N字节的连续空间,所以这些剩余的内存空间中小于N字节的连续内存空间就是内存碎片。
Redis内存碎片是如何形成的?
内部原因:
内存分配器的分配策略决定操作系统无法做到“按需分配”。
Redis使用libc、jemalloc、tcmalloc多种内存分配器来分配内存,默认使用jemalloc。内存分配器是按照固定大小来分配内存空间,不是完全按照应用程序申请的内存大小来分配。
以jemalloc为例,是按照一系列固定的大小划分内存空间,例如8字节、16字节、32字节、...、2KB、4KB等。当程序申请的内存最接近某个固定值时,jemalloc就会给它分配相应大小的空间。
外部原因:
键值对大小不一样,并且键值对可以被修改和删除。
Redis申请内存空间分配时,对于大小不一的内存空间需求,内存分配器按照固定大小分配内存空间,分配的内存空间一般都会比申请的内存空间大一些,这会产生一定的内存碎片。键值对会被修改和删除,会导致空间的扩容和释放。
Spring AI Alibaba 格式化输出详解
