Tipos de JVM Garbage Collectors en Java con detalles de implementación

requisitos previos: recolección de basura , algoritmo Mark and Sweep

Recolección de basura : La recolección de basura, también conocida como GC, es una de las características más importantes de Java . La recolección de basura es el mecanismo utilizado en Java para desasignar la memoria no utilizada, que no es más que limpiar el espacio consumido por los objetos no utilizados. Para desasignar la memoria no utilizada, el recolector de basura realiza un seguimiento de todos los objetos que todavía están en uso y marca el resto del objeto como basura. Básicamente, el recolector de basura usa el algoritmo Mark and Sweep para borrar la memoria no utilizada.

Tipos de recolección de basura :

La JVM en realidad proporciona cuatro recolectores de basura diferentes. Cada recolector de basura variará en el rendimiento de la aplicación y la pausa de la aplicación. El rendimiento de la aplicación denota la velocidad a la que se ejecuta una aplicación Java y la pausa de la aplicación significa el tiempo que tarda el recolector de elementos no utilizados en limpiar los espacios de memoria no utilizados.

  1. Recolector de basura en serie: Esta es la implementación de GC más simple, ya que básicamente funciona con un solo hilo. Si seleccionamos el recolector de basura en serie como nuestro recolector de basura predeterminado, cada vez que llamemos al recolector de basura para limpiar la memoria no utilizada, el recolector de basura en serie contiene todos los subprocesos en ejecución de la aplicación, es decir, funciona congelando todos los subprocesos de la aplicación y creará un solo subproceso para realizar la recolección de basura. Congela todos los demás subprocesos en ejecución de la aplicación hasta que finalizan las operaciones de recolección de elementos no utilizados. Si usamos Serial Garbage Collector como nuestro recolector de basura predeterminado, el rendimiento de la aplicación disminuirá y el tiempo de pausa de la aplicación aumentará. Como resultado, esta implementación de GC congela todos los subprocesos de la aplicación cuando se ejecuta. Por lo tanto, no es una buena idea usarlo en aplicaciones de subprocesos múltiples como entornos de servidor.

    Implementación:
    si desea utilizar el recolector de basura en serie, debemos mencionar explícitamente mientras ejecuta jar como:

    java -XX:+UsarSerialGC -jar GFGApplicationJar.java

  2. Recolector de basura en paralelo: El Recolector de basura en paralelo es el recolector de basura predeterminado en Java 8. También se conoce como Recolector de rendimiento . Parallel Garbage Collector es igual que Serial Garbage Collector porque Parallel Garbage Collector también congela los subprocesos en ejecución de la aplicación mientras realiza la recolección de elementos no utilizados. Pero la diferencia es que Parallel Garbage Collector utiliza varios subprocesos para realizar la limpieza del área de almacenamiento dinámico no utilizada. La ventaja de usar Garbage Collector como GC predeterminado es que podemos mencionar algunos atributos para el recolector de basura, como
    • Cuántos subprocesos puede usar el recolector de basura para realizar la recolección de basura.

      Implementación:

      java -XX:+UseParallelGC -XX:ParallelGCThreads= Número de subprocesos -jar GFGApplicationJar.java

    • La pausa máxima que puede tomar el recolector de basura mientras realiza la recolección de basura

      Implementación:

      java -XX:+UseParallelGC -XX:MaxGCPauseMillis= SecInMillisecond -jar GFGApplicationJar.java

    El recolector de basura paralelo es mucho mejor que el recolector de basura en serie, pero un problema con el recolector de basura paralelo es que también detiene la aplicación durante operaciones menores. Es más adecuado si las aplicaciones pueden manejar tales pausas. Si usamos JDK 8, el GC paralelo es el recolector de basura predeterminado.

    Implementación: si estamos ejecutando Java 9 y queremos usar un recolector de basura paralelo, debemos usar el siguiente comando:

    java -XX:+UsarParallelGC -jar GFGApplicationJar.java

  3. Recolector de basura de CMS: El recolector de basura de CMS se conoce como recolector de basura de barrido de marcas concurrente . Este recolector de elementos no utilizados utiliza múltiples subprocesos para escanear la memoria del montón de manera consistente para marcar los objetos que no se usan y luego barrer los objetos marcados. Como sabemos, el recolector de basura en serie y el recolector de basura en paralelo congelan los subprocesos en ejecución de la aplicación mientras realizan la recolección de basura. Pero el recolector de basura de CMS congelará los subprocesos en ejecución, es decir, pausará la aplicación solo en dos casos:
    • Mientras realiza la recolección de basura, si hay un cambio en la memoria del montón en paralelo.
    • Mientras marca los objetos referenciados en el espacio de generación anterior.

    Si comparamos el recolector de CMS con el recolector de basura paralelo, el recolector de CMS usa más CPU para garantizar un mejor rendimiento de la aplicación. Si estamos desarrollando una aplicación en la que podemos proporcionar más recursos de CPU para un mejor rendimiento, entonces el recolector de elementos no utilizados de CMS es la opción preferida sobre el recolector paralelo. Para habilitar CMS Garbage Collector, podemos usar el siguiente argumento:

    java -XX:+UsarParNuevoGC -jar GFGApplicationJar.java

  4. Recolector de basura G1: En primer lugar, G1 Garbage Collector se introdujo en JDK 7. Inicialmente, se diseñó para proporcionar un mejor soporte para aplicaciones de memoria de almacenamiento dinámico más grandes. G1 Garbage Collector es el recolector de basura predeterminado de Java 9. El recolector G1 reemplazó al recolector CMS ya que es más eficiente en rendimiento. El funcionamiento de G1 Garbage Collector es diferente al de otros recolectores. A diferencia de otros recopiladores, el recopilador G1 divide el espacio de almacenamiento dinámico en varias regiones del mismo tamaño. Básicamente, está diseñado principalmente para una aplicación que tiene un tamaño de almacenamiento dinámico superior a 4 GB. Divide el área del montón en múltiples regiones que varían de 1 MB a 32 MB. Mientras realiza la recolección de elementos no utilizados, G1 Garbage Collector marca la región del almacenamiento dinámico que tiene objetos que están en uso en todo el almacenamiento dinámico. Con la ayuda de este recolector de basura, tiene la información sobre las regiones que contienen la mayoría de los objetos que se usan menos y el recolector de basura primero realiza la recolección de basura solo en esa región. Por eso se le conoce como el primer recolector de basura G. G1 también compacta el espacio de almacenamiento dinámico justo después de la recolección de elementos no utilizados, lo que hace que G1 Garbage Collector sea mejor que otros recolectores de elementos no utilizados. G1 Garbage Collector es el recolector de basura predeterminado de Java 9.

    Implementación: si estamos usando una versión de Java inferior a la 9 y queremos usar G1 Garbage Collector, debemos mencionarlo explícitamente mientras ejecutamos un archivo jar como:

    java -XX:+UsarG1GC -jar GFGApplicationJar.java

Publicación traducida automáticamente

Artículo escrito por Bishal Kumar Dubey y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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