1. 内存池的目的
- 提高程序效率
- 减少运行时间
- 避免内存碎片
为什么会产生内存碎片?
1.内部碎片是采用固定大小的内存分区,当一个进程不能完全使用分配给它的固定内存分区时,就会产生内存碎片。
2.外部碎片是由于可分配的连续内存太小,不能满足任何进程的需求,从而不能被进程使用。
再扯一个概念:段页式内存分配方式
将进程的内存区域分成不同的段,段由多个固定大小的页组成。那么通过页表机制,段内的页就不需要存储在同一块内存区域。
段页式内存分配方式
默认内存管理
当我们调用new在堆上分配一些内存的时候,系统收到了分配内存的请求,就会根据一定的算法在空闲内存块里寻找适合该内存大小的内存块。如果内存块过大,就会将内存块分割成适合的内存块。释放内存块后,内存块就会重新被放入空闲内存块中。默认内存管理里还用到了多线程的应用,每次分配和释放内存的时候都需要加锁,这样就损耗了性能。
可见,如果应用程序频繁地在堆上分配和释放内存,则会导致性能的损失,并且会使系统中出现大量的内存碎片,降低内存的利用率
2. 内存池的定义和分类
2.1 定义
顾名思义,我们在系统申请一块适合的内存作为内存池,应用程序对内存的分配和释放都在这个内存池里实现,只有当内存池不够大需要动态扩增的时候才会调用系统的分配内存函数,其他时间对内存的一切操作都是用应用程序控制的。
2.2 分类
从线程安全角度看,有多线程内存池和单线程内存池。
从内存池可分配大小来看,有固定大小内存池(在这里的固定指的是每一次和系统申请的内存的大小都是固定的,而不是这个内存池大小只能那么大)和可变内存池
3. 固定内存池
3.1 固定内存池的简要理解
固定内存池由一系列固定大小的内存块组成,每一个内存块里又包含了固定数量和大小的内存单元。其实在内存池初次生成的时候,我们只是向系统申请了一块内存块,返回一个指针作为整个内存池的头指针。后面随着内存池的不断扩大,我们通过指针将内存池连接在一起。
因为每一次系统都是分配固定大小的内存,所以系统的分配效率高。