如何减小内存碎片

内存碎片 :

内部碎片(占了不用)

内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;

内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。

单道连续分配只有内部碎片。多道固定连续分配既有内部碎片,又有外部碎片。

外部碎片(太小&不连续 -》没法用)

外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。

外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。

多道可变连续分配只有外部碎片。

从编程层面来说:

1.尽可能少开辟内存空间,尽量复用内存空间

2.使用完内存空间后,尽快释放掉。

3.合理使用Union可以减小内存占用

4.合理安排struct或者class中的成员变量的位置

5.已知大小的数组静态开辟,未知大小的采用动态开辟

6.可以自己手动维护内存分配。(在申请的内存很小时 有用)一次申请一大块内存,然后分成将其分成小块,每次用的时候将小块分配出去,释放的时候大块一起释放。

比如说,在内存单元100的起始地址到内存单元200之间,一共申请了100块1字节的区域,但是释放的时候,先释放了内存地址为基数的单元,如释放101、103...而偶数单元不释放,释放50次后,虽然还有50字节的内存是空余的,但是如果下次要申请2字节的内存单元,是无法在100到200之间申请到的,因为这个区域没有连续的2字节空间,这就是内存碎片。

从OS层来说:

1.段页式内存管理: 现在普遍采用的段页式内存分配方式就是将进程的内存区域分为不同的段,然后将每一段由多个固定大小的页组成。通过页表机制,使段内的页可以不必连续处于同一内存区域,从而减少了外部碎片,然而同一页内仍然可能存在少量的内部碎片,只是一页的内存空间本就较小,从而使可能存在的内部碎片也较少。

时间: 2024-10-18 21:14:57

如何减小内存碎片的相关文章

Memcache和redis的区别

源链接:http://gnucto.blog.51cto.com/3391516/998509 传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: 1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间. 2.Memcached与MySQL数据库数据

redis学习

Redis是一款开源,高性能键-值存储(key-value store).它的键值可以包括字符串(strings)类型,同时它还包括哈希(hashes),列表(lists),集合(sets)等数据类型.对于这些数据类型,可以执行原子操作.例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集,并集与差集等. 经常有人拿memcached和redis做比较.下面简单看下他们之间有哪些差别: 1.网络IO模型 memcached是多线程,非阻塞IO复用的网络模型

原来你们是这种key-value存储

上周毛老师,在内部分享为我们扫盲了一下Memcached和Redis的支持,讲了很多东西,我一般比较懒不愿意去记东西喜欢把总结成blog,当我忘记的时候可以回头看看.好的废话就说这么多.先看Memcached和Redis的介绍: Memcached memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用.这是一套开放源代码软件,以BSD license授权发布. memcached缺乏认证以及安全管制,这代表应该将mem

Redis和Memcached的区别

?说到redis就会联想到memcached,反之亦然.了解过两者的同学有那么个大致的印象:redis与memcached相比,比仅支持简单的key-value数据类型,同时还提供list,set,zset,hash等数据结构的存储:redis支持数据的备份,即master-slave模式的数据备份:redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用等等,这似乎看起来redis比memcached更加牛逼一些,那么事实上是不是这样的呢?存在即合理,我们来根

memcached与redis的区别

1.redis中的缓存数据并不是都在内存中,redis在maxmemory或vm开启并且vm-max-memory到达上限时出发置换操作用swap机制将部分value对象(冷数据)转移至磁盘,同时将redisobj替换成VM pointer对象,标识value值在磁盘的存储位置,分有阻塞跟非阻塞机制,所以redis可以存储远超容量本身的数据 2.网络io模型:Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字p

redis和mamcatch区别

Redis 几个特点1.Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll.kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序.聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的.2.Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,

Redis与Memcached的区别

       传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: 1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间. 2.Memcached与MySQL数据库数据一致性问题. 3.Memcached数据命中率低或down机,大量访问直接穿透到D

ART运行时Compacting GC堆创建过程分析

引进了Compacting GC之后,ART运行时的堆空间结构就发生了变化.这是由于Compacting GC和Mark-Sweep GC的算法不同,要求底层的堆具有不同的空间结构.同时,即使是原来的Mark-Sweep GC,由于需要支持新的同构空间压缩特性(Homogeneous Space Compact),也使得它们要具有与原来不一样的堆空间结构.本文就对这些堆空间创建过程进行详细的分析. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 从前面AR

传统MySQL+ Memcached架构遇到的问题

实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间. Memcached与MySQL数据库数据一致性问题. Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑. 跨机房cache同步问题. 众多NoSQL百花齐放,