求大神给解答一下,内存碎片产生原因,以及处理方法,最近看见有关内存碎片的问题 ,我有点没看懂,不知道为什么会产生内存碎片,正常的new和delete,不是不会产生内存泄露么,为什么会产生内存碎片呢!
在小对象对内存的频繁的动态申请和释放的过程中,由于释放后留下的空洞不够新对象的分配,导致不连续的内存可用空间无法被应用程序获得,造成可用内存迅速备耗尽。这样就造成了内存碎片的产生。
在小对象对内存的频繁的动态申请和释放的过程中,由于释放后留下的空洞不够新对象的分配,导致不连续的内存可用空间无法被应用程序获得,造成可用内存迅速备耗尽。这样就造成了内存碎片的产生。
new如果没有delete导致的是内存泄漏
而内存碎片是“碎片的内存”描述一个系统中所有不可用的空闲内存,这些碎片之所以不能被使用,是因为负责动态分配内存的分配算法使得这些空闲的内存无法使用,这一问题的发生,原因在于这些空闲内存以小且不连续方式出现在不同的位置。因此这个问题的或大或小取决于内存管理算法的实现上。
为什么会产生这些小且不连续的空闲内存碎片呢?
实际上这些空闲内存碎片存在的方式有两种:a.内部碎片 b.外部碎片 。
内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除
外部碎片的产生: 频繁的分配与回收物理页面会导致大量的、连续且小的页面块夹杂在已分配的页面中间,就会产生外部碎片
参考楼上
new和delete会产生碎片,举个例子:
假设heap是10MB,我用new依次从这个堆里得到了3块内存块,分别是:1M、2M和7M。
假设这三块内存是连续的。那么如果你把1M和7M的块delete掉,那么这个heap里就有了8M的剩余空间,但是这个8M是不连续的:1个1M的块和1个7M的块,两者被那个2M给分隔开了。
这时候如果你要申请一个连续的8M内存区,虽然这个heap有8M的剩余空间,但却没法给你。原因就是这个碎片。
主要有两点,一是申请的内存地址是跟页或段有关系,必须是倍数关系,一般是4,8,16的倍数。二是申请的内存空间必须是连续的,无法跨地址。所以就会产生碎片。
处理办法,没有绝对的好办法。结构体的对齐;用完内存及时释放;或者是使用内存池,就可以按自己需要来管理内存,比如对于申请小片的内存就不要使用新的内存快,而是使用之前用过已经释放的,这样之后如果要申请大空间那就可以申请也会减少碎片。
比方说,你申请了几块内存,释放了中间几块,那么虽然可用内存的总数很大,但是不连续,那么如果申请比较大的内存时,又没有连续的这么大的内存了,就会失败
频繁new和delete小对象容易造成这种情况,比如delete的都是些不连续的小内存,那么这些不连续的空间虽然是可用的,但大的对象实际是无法使用的。
可以每次new或delete一个大一点的内存,也可以做一个可利用空间表之类的管理方式。
可以进内存整理, 不过因为改动麻烦,比较慢