Quanto è importante correggere le perdite di memoria?

19

Ho trovato da Valgring che alcuni programmi GTK + perdono memoria. Quanto è importante correggere queste perdite? Voglio dire, spesso questi programmi funzionano molto bene, ma d'altra parte, non si può mai essere sicuri se si vuole copiare parte del codice che perde in qualche altro programma. E non sono sicuro che l'idea di GTK + -programs funzioni rapidamente e quindi ci sono perdite.

Quindi, se a volte trovo una perdita di memoria in un programma open source, dovrei risolverlo o ci sono per esempio problemi di efficienza e quindi l'idea originale dei programmatori era scrivere un piccolo codice che perde?

    
posta Jaakko Seppälä 13.10.2013 - 19:44
fonte

4 risposte

6

Quanto è importante correggere le perdite di memoria dipende dalla gravità del problema e che altro è importante farlo. La mia esperienza è che piccole perdite di memoria tendono ad essere piuttosto benigne per la maggior parte delle applicazioni. La durata di una sessione di app desktop non è in genere abbastanza lunga per vedere eventuali degradi da una piccola perdita di memoria.

Se stai scrivendo un server che funziona 24 ore su 24, 7 giorni su 7, piccole perdite di memoria possono accumularsi nel tempo e diventare un grave problema. Ma è per questo che molte aziende pianificano il riavvio giornaliero o settimanale dei server. Lo sforzo di trovare perdite di memoria è spesso eccessivo rispetto a ciò che potrebbe essere ottenuto, quindi è più facile riavviare i server su base regolare e passare a cose più importanti.

    
risposta data 02.10.2015 - 22:40
fonte
35

Per i programmi a esecuzione ridotta, le perdite di memoria non sono così importanti; il sistema operativo reclamerà tutto al momento della risoluzione, ma potrebbero far sì che altre risorse non vengano rilasciate.

Tuttavia, la corsa breve è relativa, una perdita può perdere il controllo in poche ore o accumularsi per settimane senza essere notata.

Il mio consiglio è di presentare un bug nel tracker con una correzione proposta, se il lead si preoccupa che lo aggiusterà.

Anche il tipo di perdita è importante. È possibile che l'allocazione delle perdite sia un'assegnazione una tantum in cui gli sviluppatori si sono deliberatamente affidati al sistema operativo per la pulizia. Questi daranno un falso positivo su valgrind.

    
risposta data 13.10.2013 - 19:52
fonte
0

Nel mio parere, peraltro dogmatico, su questo argomento, non ci sono scuse per le fughe fisiche, almeno in una biblioteca che si propone di essere ampiamente applicabile. Quindi cercherò di intercettare gli sviluppatori GTK + finché non lo risolvono da soli.

È abbastanza banale per una libreria registrare atexit callback per liberare tutta la memoria allocata almeno dopo essere stata scaricata. Se vuole evitare le spese di un carico di adolescenti di allocazioni teeny, non dovrebbe farlo in primo luogo.

Anche il programma più pigro che voglia solo allocare una barca di piccoli pezzi di memoria in una volta sola potrebbe usare un semplice allocatore sequenziale che cancella tutta la memoria all'arresto. Se l'allocatore non vuole nemmeno occuparsi dell'allineamento, può semplicemente riempire ogni singolo blocco che esso raggruppa ai limiti di allineamento massimo. Se fosse in grado di beneficiare di tempi di spegnimento più rapidi non liberando tutti quei piccoli pezzi di memoria individualmente, allo stesso modo beneficerebbe in modo simmetrico in cambio di uno sforzo banale usando un tale allocatore sequenziale che raggruppa la memoria in modo diretto e sequenziale con allocazioni molto più veloci di malloc e più modelli di memoria cache-friendly, solo per avere tutti i grandi blocchi di memoria contigua accumulati dall'allocatore liberati quando la libreria è terminata. Tutto ciò che la libreria deve fare è sostituire le loro chiamate malloc per le quali non si preoccupano di free con qualcosa come seq_malloc , e chiama seq_purge in un callback atexit per liberare tutta la memoria allocata dopo essere stata scaricato.

Altrimenti hai questa cattiva libreria che ingombra i messaggi negli strumenti di rilevamento delle perdite di memoria che ora devi filtrare. Peggio ancora, se non li filtrate sistematicamente, potrebbero oscurare le perdite nella vostra applicazione e i vostri colleghi potrebbero sviluppare l'abitudine di trascurarli, riducendo l'utilità degli strumenti di rilevamento delle perdite, in primo luogo, impedendo alla vostra squadra di spingendo codice leaky. È grossolano e brutto e soprattutto non trovo gli argomenti a favore di fare questo deliberatamente per essere irresistibili dato quanto è banale usare la soluzione sopra.

Le perdite logiche (il tipo più complesso che nemmeno la garbage collection è in grado di proteggere) sono un problema più complesso e potrei trovare qualche giustificazione per i programmi di breve durata che hanno perdite logiche fintanto che eliminano tutta quella memoria sono stati assegnati allo spegnimento poiché richiede una grande quantità di pensiero sulla gestione delle risorse per evitare perdite logiche (probabilmente più nelle lingue con GC). Ma non trovo nessuna scusa ragionevole per evitare perdite fisiche, visto quanto sono banali da evitare anche nei contesti più pigri.

In ogni caso, perlomeno filtrerei le perdite in Valgrind in modo che almeno non compromettessero l'abilità della tua squadra di individuare le tue.

    
risposta data 08.12.2017 - 13:22
fonte
0

FWIW, se un utente ha segnalato una perdita in un'applicazione su cui lavoro, sarei molto propenso a correggerlo (specialmente se includesse il codice per la correzione nella segnalazione di bug!). Detto questo, potrebbe non accadere immediatamente se la perdita fosse piccola e altri problemi fossero più urgenti (ad esempio, un bug che si verificava di frequente). Ma lo apprezzerei sicuramente e lavorerò per risolverlo alla fine. Dovresti assolutamente farglielo sapere. Lo apprezzeranno e lavoreranno per risolverlo (molto probabilmente), oppure non gli interesseranno e tutto ciò ti costerà un po 'di tempo.

    
risposta data 09.12.2017 - 05:30
fonte

Leggi altre domande sui tag