Domanda

La mia applicazione simile al programma ipotetico:

for(;;) {
  for (i=0; i<1000; i++) {
    p[i] = malloc(random_number_between_1000_and_100000());
    p[i][0]=0;  // update
   }
  for (i=0; i<1000; i++) {
    free(p[i]);
  }
}

Non ha perdite di memoria ma sul mio sistema, il consumo di memoria (in alto, colonna VSS) aumenta senza limiti (come il 300% della memoria fisica disponibile). È normale?

Aggiornato : usa la memoria per un po 'e poi liberala. Questa è una differenza?

È stato utile?

Soluzione

Prova ad aggiungere

  sbrk(-1);

alla fine di ogni ciclo per vedere se fa differenza.

Il free () disloca solo la memoria ma non la restituisce al sistema operativo.

Altri suggerimenti

Il comportamento è normale. Citando man 3 malloc :

BUGS

Per impostazione predefinita, Linux segue una strategia di allocazione della memoria ottimistica. Ciò significa che quando malloc () restituisce un valore NULL non esiste alcuna garanzia che il file        la memoria è davvero disponibile. Questo è un bug davvero brutto. Nel caso in cui il sistema esaurisca la memoria, lo saranno uno o più processi        ucciso dal famigerato assassino OOM. Nel caso in cui Linux venga impiegato in circostanze in cui sarebbe meno desiderabile perdere improvvisamente un po 'a caso        processi scelti e inoltre la versione del kernel è sufficientemente recente, è possibile disattivare questo comportamento di commit eccessivo usando un comando come:

       # echo 2 > /proc/sys/vm/overcommit_memory

Vedi anche la directory della documentazione del kernel, i file vm / overcommit-accounting e sysctl / vm.txt.

È necessario toccare (leggere / scrivere) la memoria affinché il kernel Linux lo riservi effettivamente.

Il sistema operativo di solito assegna tutte le pagine come cloni Copy-On-Write dello "0". pagina, ovvero una pagina fissa piena di zeri. Lettura dalle pagine restituirà 0 come previsto. Finché leggi solo, tutti i riferimenti vanno la stessa memoria fisica. Dopo aver scritto un valore, " COW " è rotto e viene assegnato un frame di pagina reale, fisico. Questo significa che finché non si scrive nella memoria è possibile conservare allocare memoria fino a quando lo spazio degli indirizzi di memoria virtuale si esaurisce o la tabella delle pagine riempie tutta la memoria disponibile.

Finché non tocchi quei blocchi allocati, il sistema non li allocerà realmente per te.
Tuttavia, puoi esaurire lo spazio indirizzabile che è un limite imposto dal sistema operativo ai processi e non è necessariamente il massimo che puoi indirizzare con il tipo di puntatore del sistema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top