内存池
来源:互联网 发布:截图软件电脑版 编辑:程序博客网 时间:2024/06/03 12:23
内存池是为了快速高效的内存利用,提高程序效率,降低内存开辟和删除过程,减少内存碎片,降低申请内存失败等情况;
内存池一般是开辟堆上的空间;
思路有两种:
思路一:链表环形内存池,可以动态增减;
思路二: 申请一个巨大的内存,然后分段应用;亦可根据实际增减;
这里的增减可以用两种方式:
(1):可以用malloc和remalloc等C语言函数实现,这样的好处是之前指定的指针位置不会变化;
(2):如要申请的内存已经超出现有的内存池中内存的大小,可以重新申请一块更大的内存(现有内存池大小 + 新申请的内存大小),然后将内存池中的内存复制到新的内存中,然后新内存多出的空间中处理新的数据;
上述两个方法都可以实现内存池,但是个有缺点;
思路一的缺点:就是申请的内存每一块大小都是固定的,用过的内存返回到内存池(可以用标记记录是否已经申请);
但是如果要再次申请,那么,如果申请的size大于现有内存池中现有节点大小,就要重新申请;
如果size小于内存池中Node的size,那么就会造成浪费;
而且申请的size只要不同于内存池中Node的size在编写代码的时候也比较麻烦,而且增加内存再次申请开辟的次数,这样就降低了内存池的效率;
思路一的方法,比较适合于固定内存大小的程序应用,例如,视频图像存储,每次的图像大小一样,所以可以内存池先创建一定大小,存储图像,图像来得快就先放到内存池中,处理完成后放回内存池;
第二个的缺点,就是申请的是一块连续的内存空间,如果需要的控件不断的增加,有可能会申请失败; 当然这样也同样会产生内存池中的内存碎片;
思路二的方法,比较适合于每次内存每次大小不固定的情况;每次的数据量也不要太大,或者太多;
内存池一般是开辟堆上的空间;
思路有两种:
思路一:链表环形内存池,可以动态增减;
思路二: 申请一个巨大的内存,然后分段应用;亦可根据实际增减;
这里的增减可以用两种方式:
(1):可以用malloc和remalloc等C语言函数实现,这样的好处是之前指定的指针位置不会变化;
(2):如要申请的内存已经超出现有的内存池中内存的大小,可以重新申请一块更大的内存(现有内存池大小 + 新申请的内存大小),然后将内存池中的内存复制到新的内存中,然后新内存多出的空间中处理新的数据;
上述两个方法都可以实现内存池,但是个有缺点;
思路一的缺点:就是申请的内存每一块大小都是固定的,用过的内存返回到内存池(可以用标记记录是否已经申请);
但是如果要再次申请,那么,如果申请的size大于现有内存池中现有节点大小,就要重新申请;
如果size小于内存池中Node的size,那么就会造成浪费;
而且申请的size只要不同于内存池中Node的size在编写代码的时候也比较麻烦,而且增加内存再次申请开辟的次数,这样就降低了内存池的效率;
思路一的方法,比较适合于固定内存大小的程序应用,例如,视频图像存储,每次的图像大小一样,所以可以内存池先创建一定大小,存储图像,图像来得快就先放到内存池中,处理完成后放回内存池;
第二个的缺点,就是申请的是一块连续的内存空间,如果需要的控件不断的增加,有可能会申请失败; 当然这样也同样会产生内存池中的内存碎片;
思路二的方法,比较适合于每次内存每次大小不固定的情况;每次的数据量也不要太大,或者太多;
0 0
- 内存_内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 内存池
- 控件资源,图片资源
- java分布式通信系统(J2EE分布式服务器架构)
- Leetcode 79. Word Search
- 2016长乐夏令营Day1
- pymongo 学习-如何使用
- 内存池
- 表单样式
- 【持久化框架】SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载
- Android5.0双卡分析
- 单例模式【Singleton Pattern】
- Android通过注解初始化View
- Linux异步信号IO模型
- BZOJ1336 [Balkan2002]Alien最小圆覆盖
- 易语言 写注册项恶搞到你重装系统