Las fugas de memoria son uno de los fallos más difíciles de localizar en el software informático. Básicamente son un trozo de memoria que se asigna, pero que nunca se libera. En el caso de lenguajes como C++, se trata de una fuga directa, ya que usted es responsable de toda la asignación y liberación de memoria. En lenguajes como Java, estas fugas de memoria pueden ser extremadamente sutiles y difíciles de encontrar, ya que se supone que la recolección de basura se hace por ti. El propio acto de recolección de basura también tiende a ocultar las fugas.
La forma más fácil de detectar una fuga de memoria es ejecutar su programa y observar el uso de la memoria. Si sigue subiendo de forma constante, entonces es posible que tenga una fuga de memoria. Sin embargo, en lenguajes con GC como Java, la memoria siempre sube hasta que se alcanza la memoria completa, y entonces se produce un GC, y se recupera la memoria. En ese caso tienes que observar si el uso de la memoria inmediatamente después de que la GC termine está aumentando.
En cuanto a otros síntomas...
Cuando tu programa se ejecuta con datos, el uso de la memoria crece.
Cuando tu programa está en reposo, el uso de la memoria podría permanecer constante (a menos que tu fuga esté en la parte de manejo de reposo del código.En un tipo de fuga de memoria, una fuga de control, te quedas sin control para recursos limitados, como controladores de archivos, sockets, etc., porque no los cierras correctamente.
Por último, hay muchas, muchas herramientas para detectar estos problemas, precisamente porque son tan difíciles de identificar fácilmente. Los perfiladores, los complementos de memoria y los depuradores son todas buenas opciones para encontrar fugas de memoria.