在翻阅 Java 编程思想英文原版时,读到了 pool of memory一词,而 Java 的堆内容就属于内存池。
内存池(Memory Pool),又被称为固定大小区块规划(fixed-size-blocks allocation),允许程序员以类似 C语言 的 malloc 或是 C++ 的 new 操作数进行动态的存储器规划。对于其它动态存储器规划的实践来说,因为会变动存储器区块大小导致的碎片问题,导致在实时系统上受限于性能因此,根本无法使用。内存池提供了一个更有效率的解决方案:预先规划一定数量的存储器区块,使得整个程序可以在运行期规划 (allocate)、使用 (access)、归还 (free) 存储器区块。
一个简单的实践示例
这个简单的内存池实践模块在编译期规划 3 个示例内存池,其区块将大小针对程序的需求做最优化。
这个程序可以下列接口来规划、使用及归还存储器区块:
从内存池中规划存储器区块。这个函数会先检测当前的内存池是否仍有足够空间可以规划所需的存储器区块,若空间已不足,将继续尝试下一个内存池。一个已规划的存储器区块将使用handle来表示
获取一个指向已规划存储器区块的指针
归还之前规划的存储器区块
用以代表存储器区块的handle,可以使用像是 unsigned int 的数据类型来实践。
内存池与 malloc 的比较
优点
内存池允许在运行期以常量时间规划存储器区块,并且不会有存储器破碎的情况产生。一次归还存储器中成千上万个对象的存储器区块只需要一个操作,无需像 malloc 一般需要个别 free。
内存池可以在层次结构式的树状结构中被分群,非常适合某些特定的程序结构,例如递归与迭代。
固定区块大小的内存池不需将每次规划的信息记录下来(例如规划的存储器区块大小,因为每次规划都是一样的)。针对一些小而多的存储器区块规划会节省一些空间。
缺点
内存池模块在使用时,必须依照程序需求来做个别调整,才能保持时间与空间效率。