簡體   English   中英

為什么malloc消耗那么多內存?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM