内存池技术详解
我们都知道频繁的动态内存分配很可能会造成大量的内存碎片和效率低下,因为需要搜索整个空闲链表找到可以被分配的内存块,而且容易造成内存泄漏等问题,那么如何解决这两个问题呢?
内存池技术带你走进这个问题的殿堂。
内存池技术首先会分配一大块内存给程序,当程序需要分配内存的时候从内存池中去获得,而且不需要去释放内存,当内存池不在用的时候释放整个内存即可,只分配,不释放,大大减少了时间。
优势:
1·效率快,无需调用malloc或者new,系统调用慢,而且搜索空闲块也慢
2·不会产生过多的内存碎片,
3·可以避免内存泄漏
nginx=NX
nginx的内存池设计非常巧妙得利用了HTTP短连接的特性,为每一个HTTP请求分配一个内存块,当HTTP连接保持时,这个内存块只分配不释放,当 HTTP断开时,释放整块大内存,由于HTTP基本上连接时间都是非常短的,所以不可能会出现内存池把整个内存沾满的情况
memcached的内存池主要是针对键值对的特性进行优化的,但实现方式和nginx完全不同,这个我没有仔细研究,具体特性不详
STL的二级分配器也是一种属于只分配不释放的内存池,但是它只针对于小雨128bytes的小块内存申请和释放,大于128bytes的内存申请还是直 接调用malloc的。在使用STL过程中,默认是关闭二级分配器,如果真要使用,要通过宏来进行打开该功能。但是用这个分配器要小心,如果你申请了大量 的小块内存,有可能占满机器的内存的话,STL就有可能造成整个系统内存不足了,因为它不释放!但性能还是非常强悍的。