Posso esaurire la memoria virtuale su Linux?
-
05-07-2019 - |
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?
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.