Saltear al contenido principal

¿Qué es Java Garbage Collection? Cómo funciona, mejores prácticas, tutoriales y más

[ad_1]

En Tutoriales Java, también nos ocupamos de los problemas de rendimiento de nuestro código, incluidos los relacionados con la recolección de basura de Java. En esta publicación, veremos la recolección de basura de Java, cómo funciona y por qué es importante.

Una definición de recolección de basura de Java

La recolección de basura de Java es el proceso mediante el cual los programas de Java realizan la administración automática de memoria. Los programas Java se compilan en código de bytes que se pueden ejecutar en una máquina virtual Java o, para abreviar, JVM. Cuando se ejecutan programas Java en la JVM, los objetos se crean en el montón, que es una parte de la memoria dedicada al programa. Eventualmente, algunos objetos ya no serán necesarios. El recolector de basura encuentra estos objetos no utilizados y los elimina para liberar memoria.

Cómo funciona la recolección de basura de Java

La recolección de basura de Java es un proceso automático. El programador no necesita marcar explícitamente los objetos que se eliminarán. La implementación de la recolección de basura reside en la JVM. Cada JVM puede implementar la recolección de basura de la forma que desee; el único requisito es que cumpla con la especificación JVM. Aunque hay muchas JVM, el HotSpot de Oracle es, con mucho, el más común. Ofrece un conjunto sólido y maduro de opciones de recolección de residuos.

Aunque HotSpot tiene varios recolectores de basura optimizados para varios casos de uso, todos sus recolectores de basura siguen el mismo proceso básico. En la primera etapa, los objetos a los que no se hace referencia se identifican y marcan como listos para la recolección de basura. En el segundo paso, se eliminan los objetos marcados. Opcionalmente, la memoria se puede comprimir después de que el recolector de basura elimine objetos, de modo que los objetos restantes estén en un bloque contiguo al comienzo del montón. El proceso de compresión facilita la asignación de memoria para nuevos objetos de forma secuencial después del bloque de memoria asignado para los objetos existentes.

Todos los recolectores de basura HotSpot implementan una estrategia de recolección de basura generacional que categoriza los objetos por edad. La lógica detrás de la recolección de basura generacional es que la mayoría de los objetos son de corta duración y estarán listos para la recolección de basura poco después de su creación.

El montón se divide en tres secciones:

  • Generación joven: Los objetos recién creados comienzan en la Generación Joven. The Young Generation se subdivide en un espacio en Eden, donde comienzan todos los objetos nuevos, y dos espacios en Survivor, donde los objetos se mueven desde Eden después de sobrevivir a un ciclo de recolección de basura. Cuando los objetos se recolectan como basura de generación joven, es un evento de recolección de basura secundaria.
  • Vieja generación: Los objetos de larga vida eventualmente se trasladan de la generación joven a la generación anterior. Cuando los objetos se recolectan como basura de vieja generación, es un evento importante de recolección de basura.
  • Generación permanente: Los metadatos, como clases y métodos, se almacenan en la generación permanente. Las clases que ya no están en uso se pueden recolectar como basura de generación permanente.

Durante un evento de recolección de basura completo, los objetos no utilizados en todas las generaciones se recolectan como basura.

HotSpot tiene cuatro recolectores de basura:

  • De serie: Todos los eventos de recolección de basura se llevan a cabo en serie en un hilo. La compactación se realiza después de cada recolección de basura.
  • Paralelo: Se utilizan varios subprocesos para la recolección secundaria de basura. Se utiliza un solo hilo para la recolección y compactación de basura principal de la vieja generación. Como alternativa, la variante Parallel Old utiliza varios subprocesos para la recolección de basura primaria y la compactación de la generación anterior.
  • CMS (escaneo de marca simultáneo): Se utilizan varios subprocesos para la recolección secundaria de basura utilizando el mismo algoritmo paralelo. La recolección de basura principal es multiproceso, como Parallel Old, pero el CMS se ejecuta simultáneamente con los procesos de la aplicación para minimizar los eventos de «detener el mundo» (es decir, cuando el recolector de basura se está ejecutando para la aplicación). No se realiza ninguna compresión.
  • G1 (Papelera primero): El recolector de basura más nuevo tiene la intención de reemplazar el CMS. Es paralelo y simultáneo como el CMS, pero funciona de manera bastante diferente entre bastidores en comparación con los recolectores de basura más antiguos.

Beneficios de la recolección de basura de Java

El mayor beneficio de la recolección de basura de Java es que maneja automáticamente la eliminación de objetos no utilizados u objetos que están fuera de su alcance para liberar recursos de memoria vitales. Los programadores que trabajan en lenguajes sin recolección de basura (como C y C ++) deben implementar la administración de memoria manual en su código.

A pesar del trabajo adicional requerido, algunos programadores abogan por la gestión manual de la memoria en lugar de la recolección de basura, principalmente por razones de control y rendimiento. Mientras continúa el debate sobre los enfoques de administración de memoria, la recolección de basura es ahora un componente estándar de muchos lenguajes de programación populares. Para escenarios donde el recolector de basura impacta negativamente en el rendimiento, Java ofrece muchas opciones para ajustar el recolector de basura para mejorar su eficiencia.

Mejores prácticas de recolección de basura de Java

Para muchas aplicaciones simples, la recolección de basura de Java no es algo que un programador deba considerar conscientemente. Sin embargo, para los programadores que desean mejorar sus habilidades en Java, es importante comprender cómo funciona la recolección de basura de Java y cómo se puede ajustar.

Además de los mecanismos básicos de recolección de basura, uno de los puntos más importantes para entender acerca de la recolección de basura en Java es que no es determinista y no hay forma de predecir cuándo ocurrirá la recolección de basura en tiempo de ejecución. Es posible incluir una sugerencia en el código para ejecutar el recolector de basura con los métodos System.gc () o Runtime.gc (), pero no ofrecen ninguna garantía de que el recolector de basura realmente se ejecute.

El mejor enfoque para ajustar la recolección de basura de Java es establecer indicadores en la JVM. Los indicadores pueden ajustar el recolector de basura que se utilizará (por ejemplo, Serial, G1, etc.), el tamaño inicial y máximo del montón, el tamaño de las secciones del montón (por ejemplo, Generación joven, Generación antigua) y más. La naturaleza de la aplicación que se está ajustando es una buena guía de inicio para la configuración. Por ejemplo, el recolector de basura Parallel es eficiente, pero a menudo causará eventos de «detener el mundo», haciéndolo más adecuado para el procesamiento de backend donde las pausas largas para la recolección de basura son aceptables.

Por otro lado, el recolector de basura CMS está diseñado para minimizar las interrupciones, lo que lo hace ideal para aplicaciones GUI donde la capacidad de respuesta es importante. Se puede realizar un ajuste fino adicional cambiando el tamaño del montón o sus secciones y midiendo la eficiencia de la recolección de basura con una herramienta como jstat.

Recursos y tutoriales adicionales de recolección de basura de Java

Visite los siguientes recursos y tutoriales para leer más sobre la recolección de basura de Java:

[ad_2]


¿Qué es Java Garbage Collection? Cómo funciona, mejores prácticas, tutoriales y más

Esta entrada tiene 0 comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Volver arriba