2013-05-26 4 views
6

Sto sviluppando un'applicazione su un sistema Linux a 64 bit. Come ho potuto vedere, la mia app sta mangiando troppa memoria sporca. Parlando della memoria heap, cosa significa "sporco"? Cosa lo fa sorgere e cosa si può fare per evitare che si presenti?Che cos'è la memoria privata sporca?

EDIT

Sarà meglio spiegare cosa operazioni miei esegue applicazioni.

La mia applicazione viene eseguita in due thread: il primo thread invia i lavori a una coda che vengono quindi eseguiti in un altro thread. Quindi, il primo thread alloca le pagine per essere accodate e il secondo thread le deseleziona, esegue i loro lavori e li libera. Tutte queste operazioni si svolgono in un modo sicuro per i thread.

Così ho fatto un test su questa cosa, facendola fare la coda di lavoro a 100000000 ed eseguirli tutti. Fino a un certo istante, l'utilizzo della memoria aumenta. Quindi, quando il processo di accodamento termina e rimane solo quello di dequeuing, l'utilizzo della memoria inspiegabilmente non diminuisce. Infine, quando tutti i lavori vengono rimossi dalla coda e eseguiti, tutta la memoria viene liberata. Quindi, sembra che la perdita di memoria stia accadendo nel processo di rimozione, poiché quando finisce la memoria viene liberata, ma non ho trovato nulla di sbagliato nel suo codice.

So che sarebbe meglio se inserissi il mio codice qui, ma è troppo grande. Ma, da quello che ho aggiunto, qualcuno ha una supposizione su cosa potrebbe causare questo?

+1

come vedi di avere "memoria sporca dell'heap", cosa hai fatto per vederlo? – maazza

+0

@maazza Ho dato un'occhiata alla perdita di memoria '/ proc/PID/smaps' – LuisABOL

+1

? controlla con 'valgrind'. –

risposta

3

Parlando della memoria non diminuire, anche dopo aver liberato alcuni pezzi, è meglio usare mmap in modalità anonima come questo:

mmap(NULL, chunck_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 

che mappa nessun descrittore di file e restituisce un puntatore a un blocco di memoria che viene immediatamente restituito al sistema operativo quando viene rimosso. Tuttavia, mmap richiede una chiamata di sistema, che è più lenta di malloc. Pertanto, è necessario utilizzare mmap per allocare pagine di grandi dimensioni.

+0

IIRC, 'malloc' usa' mmap' per grandi allocazioni. – user172818

3

ho trovato questo

Inact_dirty: Dirty significa "potrebbe aver bisogno di scrivere su disco o di scambio." Prende altro lavoro da liberare. Gli esempi potrebbero essere file che non sono stati ancora scritti . Non vengono scritti troppo presto nella memoria per mantenere l'I/O inattivo. Ad esempio, se stai scrivendo i registri, potrebbe essere meglio attendere che sia pronto un registro completo prima di inviarlo su disco.

Tratto da qui: http://www.redhat.com/advice/tips/meminfo.html

Credo che sia abbastanza come il dirty bit sui buffer di I/O? Con questo intendo un bit che indica che questo buffer dovrebbe essere scritto su disco perché è stato modificato (su linux).

Ecco una domanda simile: https://unix.stackexchange.com/questions/33381/getting-information-about-a-process-memory-usage-from-proc-pid-smaps

+0

Grazie per aver risposto. Ha aiutato un po ', ma il punto è che non sto eseguendo alcuna operazione di I/O ... Conoscete altri motivi per cui la memoria sporca sta crescendo? – LuisABOL

+1

@LuisAntonioBotelhoO.Leite - Sulla maggior parte dei sistemi "reali" tutto l'heap è "virtuale" e può essere scritto su disco per liberare RAM per altri scopi. La tua "sporca memoria" sta crescendo perché l'applicazione non ha ancora raggiunto lo stato stazionario. –

+0

non dovresti vedere sporco come "sporco" come in inglese, significa solo che dobbiamo salvare perché è stato modificato, non è negativo, indica che i dati in memeory non si riflettono ancora sul disco – maazza