what is garbage collection java
Este tutorial explica qué es Garbage Collection en Java y cómo funciona Garbage Collector. También aprenderá sobre algoritmos para la recolección de basura:
Los lectores que tengan conocimientos de C / C ++ deben ser conscientes de que es responsabilidad del programador crear y eliminar los objetos en C / C ++.
Surgen errores graves si el programador se olvida de destruir los objetos creados. Esto se debe a que no destruir los objetos puede causar ' Sin memoria ”Errores, pérdidas de memoria, etc.
Esta situación se soluciona completamente en Java, ya que no es necesario que un programador realice un seguimiento de los objetos. Java se encarga de la destrucción de objetos por nosotros mediante la recolección automática de basura.
=> Visite aquí para aprender Java desde cero.
El proceso por el cual los objetos que ya no están en uso se eliminan de la memoria del montón se llama 'Recolección de basura'. La técnica de recolección de basura es parte de la administración de memoria en Java.
Por lo tanto, en Java, el recolector de basura destruye todos los objetos que ya no están en uso.
Lo que vas a aprender:
- ¿Qué es un recolector de basura en Java?
- ¿Cómo funciona la recolección de basura en Java?
- Algoritmos de recolección de basura en Java
- Conclusión
¿Qué es un recolector de basura en Java?
Garbage Collection en Java es administrado por un programa llamado Garbage Collector.
Garbage Collector se puede definir como un programa que se utiliza para administrar la memoria automáticamente manejando la desasignación de objetos.
Sabemos que en el lenguaje Java, los nuevos objetos se crean y se les asigna memoria usando el nuevo operador. La memoria asignada a un objeto que utiliza un nuevo operador permanece asignada hasta que las referencias utilizan este objeto.
Tan pronto como las referencias dejan de existir, se recupera la memoria que ocupa el objeto. Java luego maneja la desasignación o destrucción de objetos automáticamente y no necesitamos destruir explícitamente el objeto.
Esta técnica es la técnica de recolección de basura en Java, donde los programadores no necesitan manejar la desasignación de objetos explícitamente.
Tenga en cuenta que si los programas no desasignan la memoria cuando los objetos no la necesitan, eventualmente no quedará memoria para asignar y los programas fallarán. Esta situación se denomina pérdida de memoria.
El recolector de basura siempre se ejecuta en segundo plano en un hilo de demonio. El recolector de basura se considera el mejor ejemplo del subproceso del demonio.
El recolector de basura se ejecuta con la intención de liberar la memoria del montón. Lo hace destruyendo los objetos que son 'inalcanzables'.
¿Qué es un objeto 'inalcanzable'?
Un objeto se vuelve inalcanzable cuando no hay ni una sola referencia asociada a él.
Considere el siguiente fragmento de código:
|_+_|Como se ve en el código anterior, se puede acceder a un objeto siempre que tenga una referencia asociada. En el momento en que se elimina la asociación de referencia (una referencia de configuración a nula en el caso anterior), el objeto se vuelve inalcanzable.
Cuando un objeto se vuelve inalcanzable, se vuelve elegible para la recolección de basura (GC).
¿Cómo podemos hacer que un objeto sea apto para GC?
Aunque no se requiere que el programador destruya los objetos, ya que GC se encarga de ellos, al menos el programador puede hacer que estos objetos sean inaccesibles cuando ya no sean necesarios.
Al hacer esto, GC recolectará los objetos inalcanzables y los destruirá.
Hay algunas formas de hacer que un objeto sea apto para GC haciéndolo inalcanzable.
Son:
# 1) Anular la referencia
Dada una referencia asignada a un objeto, si este objeto ya no es necesario, asigne la referencia a nulo.
|_+_|Cuando s se establece en nulo, el objeto Student se vuelve inalcanzable.
# 2) Reasigne la referencia
Esta es otra forma de hacer que los objetos sean elegibles para GC.
Considere el siguiente código.
|_+_|Ahora, como hemos asignado s1 a otro objeto, el objeto Student al que hace referencia s1 se desreferencia.
# 3) Crea un objeto anónimo
Al crear un objeto anónimo, podemos hacer que los objetos sean elegibles para GC.
Podemos crear un objeto anónimo como se muestra a continuación:
|_+_|Una vez que hagamos que los objetos sean elegibles para GC, estos objetos pueden o no ser destruidos inmediatamente por GC. Esto se debe a que no podemos forzar explícitamente que el GC se ejecute como y cuando queramos.
¿Cuándo se ejecuta el recolector de basura?
Depende de la JVM ejecutar el programa Garbage Collector. Cuando JVM ejecuta el recolector de basura, los objetos inalcanzables se destruyen. Pero aún así, no podemos garantizar cuándo se ejecutará la JVM.
Aunque no podemos forzar la ejecución del GC, podemos solicitar una recolección de basura.
El GC se puede solicitar mediante cualquiera de los siguientes métodos.
# 1) System.gc (): La clase System de Java proporciona un método estático gc () mediante el cual podemos solicitar a la JVM que ejecute Garbage Collector.
# 2) Runtime.getRuntime (). Gc (): Al igual que System.gc (), también podemos usar el método gc () de la “clase en tiempo de ejecución” para solicitar a JVM que ejecute Garbage Collector.
Nota: No hay garantía de que el recolector de basura se ejecute después de una solicitud de estos dos métodos.
Finalización
Garbage Collector realiza la finalización justo antes de destruir los objetos. Como parte de la técnica de finalización, el recolector de basura llama al método finalize () en el objeto. El método finalize () se utiliza para realizar actividades de limpieza.
El método finalize () es proporcionado por la clase 'Object' y tiene el siguiente prototipo.
|_+_|El método finalize () se invoca siempre que el objeto se recolecta como basura
Nota: El recolector de basura solo recopila los objetos que se crean con la nueva palabra clave. Para otros objetos, tenemos que usar el método finalize () para realizar la limpieza.
El siguiente programa muestra una recolección de basura simple en Java.
|_+_|Producción
En el programa anterior, hemos creado una clase TestGC. En esta clase, hemos anulado el método finalize (). Luego, en la clase principal, creamos dos objetos de la clase TestGC. Primero, anulamos un objeto y llamamos a System.gc () para solicitar Garbage Collector.
A continuación, anulamos el segundo objeto y llamamos al método Runtime.getRuntime.gc () para solicitar Garbage Collector. El resultado muestra el resultado del método finalize dos veces, lo que indica que el recolector de basura se ejecutó dos veces.
Nota: Aunque tenemos esta salida, no se garantiza que siempre obtengamos la misma salida. Depende completamente de JVM.
¿Cómo funciona la recolección de basura en Java?
En esta sección, veremos cómo funciona Garbage Collection en Java.
Durante la recolección de basura, el recolector de basura busca la memoria del montón y luego 'marca' los objetos inalcanzables. Entonces los destruye.
Pero el problema surge cuando aumenta el número de objetos. A medida que aumentan los objetos, el tiempo necesario para la recolección de basura también aumenta, ya que busca objetos inalcanzables. Sin embargo, no afecta demasiado ya que la mayoría de los objetos tienen una vida útil corta.
El comportamiento anterior se llama 'Recolección de basura generacional' y se supone que mejora el rendimiento de JVM. En este enfoque, todo el espacio de Heap se divide en: Generación joven, Generación antigua o titular y Generación permanente.
# 1) Espacio dinámico de generación joven: Todos los nuevos objetos se crean en este espacio. Una vez que el espacio está lleno, se lleva a cabo Minor GC donde se destruyen todos los objetos muertos. El proceso de GC menor es rápido y rápido ya que la mayoría de los objetos están muertos. Los objetos que sobreviven a la generación joven se trasladan a las generaciones mayores.
# 2) Espacio dinámico de la vieja generación: Esta generación almacena objetos que sobreviven por mucho tiempo. Cuando se alcanza el umbral de edad establecido para la generación joven, el objeto se traslada a la generación anterior. Cuando se llena el espacio de la generación anterior, se realiza una GC mayor.
Major GC es lento ya que los objetos involucrados aquí son objetos vivos. A veces, se borra todo el espacio de Heap que incluye a las generaciones jóvenes y antiguas. Esto se llama 'GC completo'.
# 3) Generación permanenteL Hasta Java 7 solía haber una generación permanente (Perm Gen). JVM utilizó los metadatos retenidos de Perm Gen. JVM usó estos metadatos para describir clases y métodos usados en la aplicación. Perm Gen se eliminó en Java 8.
Recolección de basura de Java 8: Perm Gen y Metaspace
Ya hemos mencionado sobre el espacio Perm Gen que estaba presente hasta Java 7. Sin embargo, ahora en Java 8, la JVM representa los metadatos de la clase usando la memoria nativa llamada “Metaspace”.
Además de Metaspace, hay una nueva bandera llamada 'MaxMetaspaceSize' que limita la memoria utilizada para los metadatos de la clase. Si no se especifica ningún valor para MaxMetaspaceSize, Metaspace lo cambia de tamaño en tiempo de ejecución de acuerdo con la demanda de la aplicación.
Cuando el espacio de metadatos de la clase alcanza MaxMetaspaceSize, se activa Metaspace GC. Cuando hay un Metaspace GC excesivo, indica pérdida de memoria de clases, cargadores de clases, etc., así como un tamaño inadecuado.
Algoritmos de recolección de basura en Java
Hay varias formas en las que se realiza la recolección de basura. En esta sección, presentaremos cuatro métodos o algoritmos para la recolección de basura en Java.
GC en serie
Serial GC es el algoritmo GC más simple. Funciona principalmente en pequeños tamaños de pila y sistemas de un solo subproceso. Mientras trabaja, Serial GC congela todas las aplicaciones.
Para activar Serial GC, podemos usar la siguiente opción JVM.
¿Cuál es el mejor bloqueador de anuncios para Chrome?|_+_|
El comando anterior se puede dar en la línea de comandos. Aquí Application.java es un archivo para el que se habilitará el GC serial.
Rendimiento / GC en paralelo
EL algoritmo Parallel GC es el predeterminado en JDK 8. Este algoritmo utiliza múltiples subprocesos para escanear el espacio de pila y la compactación. Este algoritmo es adecuado principalmente para aplicaciones que pueden manejar pausas de subprocesos y optimizar la sobrecarga de la CPU.
Una desventaja de la GC en paralelo es que mientras se realiza una GC menor o completa, el algoritmo pausa los subprocesos de la aplicación.
El recopilador de CMS
El CMS significa ' Barrido de marca concurrente ”. Este algoritmo hace uso de múltiples concurrente hilos para escanear el montón Marcos ) para identificar objetos no utilizados y reciclar ( barrer ) ellos. El colector CMS tiene un modo Stop-The-World (STW).
El recolector entra en este modo en dos escenarios:
- Cuando se puede acceder a objetos que pertenecen a la generación anterior desde variables estáticas o puntos de entrada de hilo. Por tanto, este modo está activado durante la inicialización de las marcas de raíz iniciales.
- Cuando el algoritmo se ejecuta al mismo tiempo, la aplicación cambia el estado y obliga al recolector a regresar para asegurarse de que los objetos correctos estén marcados.
Sin embargo, el recopilador de CMS puede sufrir 'fallos de promoción'. Entonces, ¿qué es un fracaso promocional? Si los objetos del espacio de la generación joven se trasladan a la generación anterior, y el coleccionista no ha dejado suficiente espacio para estos objetos en el espacio de almacenamiento de la generación anterior, se producirá un fracaso promocional.
Para evitar fallas promocionales, podemos proporcionar más subprocesos en segundo plano al recopilador o proporcionar más tamaño de pila a la generación anterior.
El coleccionista G1
El recolector G1 es el recolector 'Primero la basura'. Está diseñado para tamaños de pila de más de 4 GB. Según el tamaño del montón, divide el tamaño del montón en regiones de tamaños que van desde 1 MB a 32 MB.
El colector G1 marca los objetos en función de la vivacidad de los objetos en todo el montón. Después de esta fase de marcado, G1 es consciente de las regiones vacías. Por lo tanto, recoge los objetos inalcanzables de estas regiones, liberando así una gran cantidad de espacio. Por lo tanto, se denomina Garbage-First ya que recopila primero las regiones que contienen basura.
También cumple con el objetivo de tiempo de pausa definido por el usuario mediante el uso de un modelo de predicción de pausa mediante la selección del número de regiones que se recopilarán según el objetivo de tiempo de pausa especificado.
Ventaja de la recolección de basura
- Garbage Collection hace que la gestión de la memoria en Java sea eficiente, ya que elimina los objetos no referenciados de la memoria del montón sin la interferencia del programador.
- Como la recolección de basura es automática y es parte de JVM, no se necesitan esfuerzos adicionales por parte del programador para reclamar memoria o destruir objetos.
- El programador no necesita escribir ningún código específico para desasignar la memoria y eliminar objetos como se hace en C / C ++.
Preguntas frecuentes
P # 1) ¿Cuál es la función de un recolector de basura?
Responder: En Java, Garbage Collector es la parte principal en la gestión de la memoria y tiene la tarea de recopilar los objetos inalcanzables y recuperar la memoria.
P # 2) ¿Qué quiere decir con recolección de basura?
Responder: La recolección de basura es la técnica mediante la cual la memoria se administra automáticamente al recuperar la memoria no utilizada. Es una característica presente en lenguajes de programación como Java, por lo que los programadores no necesitan realizar un seguimiento de los objetos no utilizados y destruirlos. Se hace automáticamente usando Garbage Collection.
Q #3) ¿Quién es responsable de la recolección de basura en Java?
Responder: La gestión de la memoria de Java está a cargo de Garbage Collection.
Q #4) ¿Cómo podemos prevenir la recolección de basura en Java?
Responder: Como el recolector de basura no recupera la memoria de las variables / objetos que están vivos, la mejor manera de prevenir la recolección de basura es seguir usando variables / objetos en todo el programa.
Q #5) ¿Cómo puede asegurarse de que un objeto se recolecta como basura?
Responder: Un objeto es elegible para recolección de basura cuando no se puede alcanzar, es decir, cuando no hay más referencias que se refieran al objeto. Aunque no podemos forzar la ejecución del recolector de basura cuando queramos, siempre podemos solicitar que se ejecute usando System.gc ().
Conclusión
La recolección de basura en Java que discutimos en este tutorial es automática y el programador no necesita preocuparse por eliminar los objetos o variables asignados en el programa.
La recolección automática de basura en Java es la característica más importante del lenguaje y es parte de la administración de memoria en Java.
Aunque la recolección de basura es realizada por JVM y está fuera del alcance del programador, siempre podemos solicitar que el recolector de basura se ejecute usando el método gc () de la clase System y Runtime.
En este tutorial, hemos discutido el proceso de finalización que se realiza antes de que Garbage Collector destruya los objetos. También hemos discutido el proceso de recolección de basura en Java. Finalmente, hemos discutido los distintos algoritmos que utiliza Garbage Collector.
Esto completa nuestra discusión sobre el recolector de basura en Java.
=> Tenga cuidado con la serie de capacitación simple de Java aquí.
Lectura recomendada
- Conceptos básicos de Java: sintaxis de Java, clase de Java y conceptos básicos de Java
- Para qué se utiliza Java: 12 aplicaciones Java del mundo real
- Tutorial de cadenas de Java | Métodos de cadena de Java con ejemplos
- Tutorial de JAVA para principiantes: más de 100 tutoriales prácticos en vídeo de Java
- Componentes Java: plataforma Java, JDK, JRE y máquina virtual Java
- Implementación de Java: creación y ejecución de un archivo JAR de Java
- Máquina virtual Java: cómo JVM ayuda a ejecutar aplicaciones Java
- Tutorial de reflexión de Java con ejemplos