Encuentra fugas de memoria en Java

Shubham Vora 20 junio 2023
  1. Causas de las fugas de memoria en Java
  2. Encuentra fugas de memoria en Java
Encuentra fugas de memoria en Java

Este artículo nos enseñará cómo encontrar una fuga de memoria de Java.

Los elementos no utilizados que ocupan espacio adicional en la memoria se conocen como pérdida de memoria. Las fugas de memoria son problemáticas porque obstruyen los recursos de memoria y ralentizan el rendimiento del sistema con el tiempo.

Si este problema no se resuelve, el programa finalmente se quedará sin recursos y fallará con un fatal java.lang.OutOfMemoryError.

Una de sus principales ventajas es la gestión automática de la memoria proporcionada por el recolector de basura integrado de Java. El recolector de basura puede resolver la mayor parte de los problemas de pérdida de memoria, ya que maneja implícitamente la asignación y liberación de memoria.

Aunque el recolector de elementos no utilizados administra correctamente una gran parte de la memoria, no puede proporcionar una defensa a prueba de fallas contra las fugas de memoria. El recolector de basura es inteligente pero no perfecto.

Incluso las aplicaciones creadas por un desarrollador concienzudo son susceptibles a pérdidas de memoria.

Causas de las fugas de memoria en Java

Una fuga de memoria de Java a menudo ocurre cuando una aplicación accidentalmente retiene referencias de objetos que ya no son necesarias. El proceso de recolección de elementos no utilizados de Java no puede liberar la memoria utilizada por estos objetos debido a las referencias a objetos no deseadas.

Las siguientes son algunas de las causas más comunes de pérdidas de memoria.

  1. Cachés sin límite.
  2. Una gran cantidad de objetos de sesión.
  3. Inserción en objetos de la Colección sin borrar.
  4. Métodos de escucha no utilizados.
  5. Cambio de página excesivo en el sistema operativo.
  6. Estructuras de datos personalizadas mal escritas.

Encuentra fugas de memoria en Java

Encontrar fugas de memoria puede ser un desafío porque no existe una forma absoluta de encontrar fugas de memoria. Para encontrar las fugas de memoria en Java, tenemos algunas formas eficientes, y esas son:

Uso del perfilador de memoria

La creación de perfiles de Java le permite realizar un seguimiento de muchas características de JVM, como la ejecución de métodos, la generación de objetos, la ejecución de subprocesos y la recolección de basura. Los generadores de perfiles de memoria pueden realizar un seguimiento de la cantidad de memoria que se utiliza y ayudar a encontrar fugas de memoria en una aplicación.

Los generadores de perfiles también pueden ayudar a examinar cómo se asignan los recursos dentro de una aplicación, como cuánto consume memoria y CPU cada función. Podemos identificar y encontrar cualquier problema utilizando el perfilador de memoria.

Las herramientas de generación de perfiles de Java le permiten descubrir las siguientes métricas.

  1. Detalles de las llamadas a métodos
  2. Uso de la memoria
  3. Tiempo de CPU de un método
  4. Los objetos creados
  5. Los objetos retirados por el recolector de basura.

Uso de volcados de montón

Es otra técnica para encontrar pérdidas de memoria en Java. Los volcados de pila ofrecen una instantánea de la memoria de pila utilizada por una aplicación Java en un momento específico.

Revelan la cantidad de instancias de objetos abiertos y su uso de memoria. Los volcados de almacenamiento dinámico pueden ayudar a determinar cuántos objetos se producen en una aplicación y si alguno de ellos posiblemente esté causando pérdidas de memoria.

Recolección detallada de basura

La recolección detallada de elementos no utilizados se puede habilitar para obtener un seguimiento detallado de la recolección de elementos no utilizados de Java. Agregue el siguiente argumento a la configuración de JVM para habilitar la recolección detallada de elementos no utilizados.

-verbose:gc

El resumen que se muestra como el informe de error predeterminado se puede usar para aprender cómo se maneja la memoria y detectar cualquier pérdida de memoria.

Uso de las advertencias de pérdida de memoria de Eclipse

El uso de las advertencias de pérdida de memoria de Eclipse es otro método para descubrir pérdidas de memoria. Eclipse puede avisarle cuando finaliza una referencia, pero un objeto continúa y no se cierra si su código cumple con JDK 1.5 o superior.

Asegúrese de que la configuración de su proyecto permita la detección de fugas. Tenga en cuenta que utilizar Eclipse podría no ser una solución completa.

En particular, si su código no es compatible con JDK 1.5 (o superior), es posible que Eclipse no detecte todas las fugas y no detecte algunos cierres de archivos.

Otras herramientas

  1. NetBeans Profiler: puede monitorear la memoria, los hilos y los recursos de la CPU y es compatible con Java SE, Java FX, EJB, aplicaciones móviles y aplicaciones web.

  2. VisualVM: VisualVM, construida sobre la plataforma NetBeans, es una herramienta fácilmente ampliable que utiliza una variedad de complementos para ofrecerle información detallada sobre sus aplicaciones para monitorear programas remotos y locales. Con este programa, puede ejecutar manualmente el recolector de basura y obtener perfiles de memoria.

  3. JProfiler: es una herramienta para crear perfiles de subprocesos, memoria y CPU que también puede examinar fugas de memoria y otros problemas de rendimiento.

  4. GCeasy: GCeasy es una herramienta que analiza los registros de recolección de basura y proporciona un enfoque simple para encontrar problemas de pérdida de memoria al revisar los registros de recolección de basura. El uso de GCeasy se fomenta aún más por el hecho de que se puede acceder a él en línea sin necesidad de una instalación informática.

  5. GC Viewer: es un programa de código abierto que permite una visualización de información rápida y sencilla utilizando datos de JVM. GC Viewer muestra información sobre el rendimiento de la recolección de elementos no utilizados, como las pausas acumulativas, las pausas más prolongadas y el rendimiento.

    Este programa no solo le permite iniciar la recolección de basura, sino que también le permite especificar el tamaño inicial del almacenamiento dinámico.

  6. Patty en acción: es otro programa de código abierto que puede usar para perfilarse y obtener perfiles específicos en profundidad. Esta herramienta se puede utilizar para examinar montones.

  7. JRockit: JRockit es una solución patentada de Oracle para aplicaciones Java SE que puede pronosticar retrasos, mostrar la recolección de elementos no utilizados y analizar problemas relacionados con la memoria.

En este tutorial, aprendimos sobre las fugas de memoria en Java, sus diferentes causas y cómo encontrarlas. Varias herramientas y técnicas se discuten en este tutorial.

Los usuarios pueden seguir las técnicas y herramientas para reducir las fugas de memoria y mejorar el rendimiento de la aplicación.

Shubham Vora avatar Shubham Vora avatar

Shubham is a software developer interested in learning and writing about various technologies. He loves to help people by sharing vast knowledge about modern technologies via different platforms such as the DelftStack.com website.

LinkedIn GitHub