Le perdite di memoria sono uno dei bug più difficili da rintracciare nei software per computer. Fondamentalmente sono una porzione di memoria allocata, ma mai rilasciata. Per linguaggi come C++, questo è un leak diretto, dato che siete responsabili di tutta l'allocazione e deallocazione della memoria. In linguaggi come Java, tali perdite di memoria possono essere estremamente sottili e difficili da trovare, dato che la garbage collection dovrebbe essere fatta per voi. L'atto stesso della garbage collection tende anche a nascondere le perdite.
Il modo più semplice per individuare una perdita di memoria è quello di eseguire il programma e guardare l'utilizzo della memoria. Se continua a salire costantemente, allora potreste avere una perdita di memoria. Tuttavia, nei linguaggi GC come Java, la memoria sale sempre fino a quando non si raggiunge la memoria piena, e poi si verifica un GC, e la memoria viene recuperata. In questo caso dovete guardare se l'uso della memoria immediatamente dopo la fine del GC sta aumentando.
Per quanto riguarda gli altri sintomi...
Quando il vostro programma gira su dati, l'uso della memoria cresce.
Quando il vostro programma è inattivo, l'uso della memoria potrebbe rimanere costante (a meno che la vostra perdita sia nella parte del codice che gestisce gli inattivi.)
Si ottengono errori "out of memory" quando si dovrebbe avere molta memoria residua.
In un tipo di memory leak, un handle leak, si esauriscono gli handle per risorse limitate, come gli handle dei file, i socket, ecc, perché non si riesce a chiuderli correttamente.
Infine, ci sono molti, molti strumenti per rilevare questi problemi, proprio perché sono così difficili da identificare facilmente. Profiler, plug-in di memoria e debugger sono tutte buone scelte per trovare le perdite di memoria.