如何减小内存碎片

Posted 暴力的轮胎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何减小内存碎片相关的知识,希望对你有一定的参考价值。

内存碎片 :

内部碎片(占了不用)

内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;
内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。
单道连续分配只有内部碎片。多道固定连续分配既有内部碎片,又有外部碎片。

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

外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。
多道可变连续分配只有外部碎片。
 

从编程层面来说:

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

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

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

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

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

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

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

从OS层来说:

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

以上是关于如何减小内存碎片的主要内容,如果未能解决你的问题,请参考以下文章

如何解决内存碎片

记一次Redis的内存碎片比过高的解决

如何了解CMS的垃圾碎片率

处理内存池中的碎片?

linux内核中内存反碎片技术

连续内存分配:内存碎片与分区的动态分配