[英]Why malloc consume that much memory?
我有一個項目,我在那里做很多malloc。 我發現內存使用量遠遠大於數據本身。 如果我使用valgrind並放置100 MB數據,則分配的內存為500 MB。 數據塊大小不同,每個20-40字節。 這是做相似的事情的最小程序,但是具有相同大小的塊。
它分配大約43 MB,但是valgrind massif顯示53 MB。
如果使用jemalloc運行,則頂部也顯示47 MB。
目前所有塊的大小都不同,我不能使用數組或其他東西。
是否可以使用某些malloc設置,或者可以使用不同的類似malloc的命令來減少浪費的內存?
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define BUFFER_SIZE 39
#define MANY 1000000LU
typedef struct _list{
void *next;
char payload[BUFFER_SIZE];
}list;
int main(){
list root;
printf("Allocating %lu chunks %zu bytes each, equals to %lu bytes\n", MANY, sizeof(list), MANY * sizeof(list));
list *node = & root;
unsigned long int i;
for(i = 0; i < MANY; i++){
node->next = malloc(sizeof(list));
if (node->next == NULL){
printf("Out of memory\n");
return 1;
}
memset(node->payload, 0, BUFFER_SIZE);
node = node->next;
}
printf("done\n");
return 0;
}
首先,開銷。 malloc
結構中的開銷很小。 我認為每個malloc
大約有8個字節。 同樣(部分出於對齊目的,部分出於實用性,部分出於最小化下面的影響),內存分配的大小將四舍五入為2的小次冪。
其次,碎片化。 假設您分配了3 900個字節的塊A,B和C,並且分配器選擇按順序分配它們。 接下來,假設B被釋放。 由於漏洞小於操作系統頁面的大小,因此B所在的“漏洞”將無法退還給操作系統。 如果使用malloc
所有后續分配都大於900字節,則該漏洞將永遠不會被填補-即被浪費掉了。 如果(例如)分配了600字節的內存,則可以將其放置在該漏洞中,但這將留下300字節的漏洞。 在這種情況下,沒有任何分配器能夠完美執行。
在現代操作系統上, malloc
的常見實現將請求大量虛擬內存空間,並將其拆分為分配池。 然后,由於其自身的優化參數(無論是通過大小,線程,碎片減少等),它將從這些池中分發該內存。 對內存的幼稚視圖將其視為浪費。 但是,在虛擬機投入使用之前,虛擬內存並不一定要由物理頁面支持,此時操作系統將根據需要為其回填映射(類似於分頁的工作方式,但具有匿名內存支持)。 因此,您認為進程使用的數字不一定是消耗的實際內存,只是分配的等待使用的VM空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.