一般应用程序自己实现内存池是为了解决大量小对象频繁分配和释放引起堆碎片的问题。不管堆本身实现得如何高效,增加自己的内存池会将堆本身管理策略对上层调用者的效率影响降至最低,特别当软件持续运行相当长的时间后,堆本身是否仍能满足调用者的需要。增加内存池用最适合自身应用程序特点的策略来接管堆内存显然会带来良好的效果。
程序中有大量小对象需要从堆上分配时会给程序带来严重的效率冲击:因为理论上堆会被大量这些小对象切割成无数段,长时间运行后堆千疮百孔,一会增加后续分配的搜索时间,二会造成后续大对象的分配失败,虽然堆内存的数量可能是够的,但是因为地址不连续也不能满足要求,(对于这种情调内存池的使用基本上必然的)。长时间运行的服务器最能体会到这一点。效率影响还来自于页面以及对齐,使用内存池能将对象集中,一次申请大块内存,然后将相关的对象分布于其上,比遍地开花将对象分散于各处要高效得多。现在操作系统的内存使用方式主要是页式印射,集中能避免频繁的页面抖动。
例如:假如一个链表有100个结点,结点是在堆上分配的。遍历这个链表时,如果100个结点集中分配于同一页面,那么无疑是高效的。但是如果这100个结果分布在100个页面上,那OS在遍历的时候需要把100页面全部换入。FT。地址的分散访问能飚升进程的RSS值,降低物理内存的使用率。自己使用内存池能控制页面对齐,缓冲对齐。。。好处多多。。。
上面有人说只有对象大小固定的才适用内存池,显然有这个当然好了,但是不构成判定用不用内存池的条件,大小不同,可以尽量让它们相同。。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!