zoukankan      html  css  js  c++  java
  • 高性能之内存池

    内存池(Memory Pool)是一种内存分配方式。 通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。
    (1)针对特殊情况,例如需要频繁分配释放固定大小的内存对象时,不需要复杂的分配算法和多线程保护。也不需要维护内存空闲表的额外开销,从而获得较高的性能。
    (2)由于开辟一定数量的连续内存空间作为内存池块,因而一定程度上提高了程序局部性,提升了程序性能。
    (3)比较容易控制页边界对齐和内存字节对齐,没有内存碎片的问题。
    (4)当需要分配管理的内存在100M一下的时候,采用内存池会节省大量的时间,否则会耗费更多的时间。
    (5)内存池可以防止更多的内存碎片的产生
    (6)更方便于管理内存

      我们都知道频繁的动态内存分配很可能会造成大量的内存碎片和效率低下,因为需要搜索整个空闲链表找到可以被分配的内存块,而且容易造成内存泄漏等问题,那么如何解决这两个问题呢?

    内存池技术带你走进这个问题的殿堂。

    内存池技术首先会分配一大块内存给程序,当程序需要分配内存的时候从内存池中去获得,而且不需要去释放内存,当内存池不在用的时候释放整个内存即可,只分配,不释放,大大减少了时间。

    优势:

    1·效率快,无需调用malloc或者new,系统调用慢,而且搜索空闲块也慢

    2·不会产生过多的内存碎片,

    3·可以避免内存泄漏

    nginx=NX

    nginx的内存池设计非常巧妙得利用了HTTP短连接的特性,为每一个HTTP请求分配一个内存块,当HTTP连接保持时,这个内存块只分配不释放,当 HTTP断开时,释放整块大内存,由于HTTP基本上连接时间都是非常短的,所以不可能会出现内存池把整个内存沾满的情况

    memcached的内存池主要是针对键值对的特性进行优化的,但实现方式和nginx完全不同,这个我没有仔细研究,具体特性不详

    STL的二级分配器也是一种属于只分配不释放的内存池,但是它只针对于小雨128bytes的小块内存申请和释放,大于128bytes的内存申请还是直 接调用malloc的。在使用STL过程中,默认是关闭二级分配器,如果真要使用,要通过宏来进行打开该功能。但是用这个分配器要小心,如果你申请了大量 的小块内存,有可能占满机器的内存的话,STL就有可能造成整个系统内存不足了,因为它不释放!但性能还是非常强悍的。

    http://hi.baidu.com/kwokwing0011/item/a2db0a0f4ecf67c675cd3cf1

    http://www.cnblogs.com/GODYCA/archive/2013/01/13/2858842.html

  • 相关阅读:
    ThinkPHP5+jQuery+MySql实现投票功能
    JQ input输入框回车生成标签,可删除,并获取标签的值
    php 使用 CURL 获取数据
    new String创建了几个对象
    java高级开发面试总结
    使用 Sublime Text 将含下划线的字符串批量替换为驼峰命名法格式的字符串
    Synchronized方法锁、对象锁、类锁区别
    利用Redisson实现分布式锁及其底层原理解析
    MySQL索引
    JVM常见面试题
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3273466.html
Copyright © 2011-2022 走看看