Diferencia entre -XX: + UseParallelGC y -XX: + UseParNewGC

82

Son algoritmos para la recolección de basura de la generación joven.

El segundo (UseParNewGC) se activa automáticamente con la recolección de basura de generación simultánea titular (consulte Java Concurrent y Parallel GC ) pero, ¿hay alguna diferencia entre los dos algoritmos paralelos?

fglez
fuente

Respuestas:

119

Después de mucha búsqueda, la mejor explicación que encontré es del sitio web de Java Performance Tuning en la pregunta del mes: 1.4.1 Algoritmos de recolección de basura, 29 de enero de 2003

Algoritmos de recolección de basura de generación joven

El recopilador de copias (original) (habilitado de forma predeterminada). Cuando este recopilador se activa, todos los subprocesos de la aplicación se detienen y la colección de copia continúa utilizando un subproceso (lo que significa solo una CPU, incluso si está en una máquina con varias CPU). Esto se conoce como una colección de parar el mundo, porque básicamente la JVM pausa todo lo demás hasta que se completa la colección.

El recopilador de copia en paralelo (habilitado mediante -XX: + UseParNewGC). Al igual que el coleccionista de copias originales, este es un coleccionista de stop-the-world. Sin embargo, este recopilador paraleliza la colección de copias en varios subprocesos, que es más eficiente que el recopilador de copias de un solo subproceso original para máquinas con varias CPU (aunque no para máquinas con una sola CPU). Este algoritmo acelera potencialmente la recopilación de generaciones jóvenes en un factor igual al número de CPU disponibles, en comparación con el colector de copias original de un solo subproceso.

El recopilador de barrido paralelo (habilitado mediante -XX: UseParallelGC). Es como el recopilador de copias en paralelo anterior, pero el algoritmo está ajustado para montones de gigabytes (más de 10 GB) en máquinas con varias CPU. Este algoritmo de recopilación está diseñado para maximizar el rendimiento y minimizar las pausas. Tiene una política de ajuste adaptable opcional que cambiará automáticamente el tamaño de los espacios de almacenamiento dinámico. Si utiliza este colector, solo puede utilizar el colector de marca y barrido original de la generación anterior (es decir, el colector concurrente de generación anterior más nuevo no puede funcionar con este colector de generación joven).

A partir de esta información, parece que la principal diferencia (aparte de la cooperación CMS) es que UseParallelGC admite la ergonomía, mientras que UseParNewGC no.

fglez
fuente
3
Enlace un poco más actualizado rapidj.com/articles/oraclecollectors1.shtml
phunehehe
@phunehehe ¡Gracias por el enlace! Es muy útil.
The Student Soul
21

GC paralelo

  • XX: + UseParallelGC Use la recolección de basura paralela para las comparaciones. (Introducido en 1.4.1)
  • XX: + UseParallelOldGC Use la recolección de basura paralela para las recolecciones completas. Al habilitar esta opción, se configura automáticamente -XX: + UseParallelGC. (Introducido en la actualización 5.0 6.)

UseParNewGC

UseParNewGC Se usa una versión paralela del recopilador de copias de generación joven con el recopilador concurrente (es decir, si se usa -XX: + UseConcMarkSweepGC en la línea de comando, entonces la marca UseParNewGC también se establece en verdadero si no se establece explícitamente en la línea de comando ).

Quizás la forma más fácil de entender fue la combinación de algoritmos de recolección de basura hechos por Alexey Ragozin

Conclusión:

  1. Aplique -XX: + UseParallelGC cuando necesite un método de recolección paralelo sobre la generación JOVEN SOLAMENTE , ( pero aún así) use el método de barrido de marca en serie como colección de generación VIEJA
  2. Aplique -XX: + UseParallelOldGC cuando necesite un método de recolección paralelo sobre la generación JOVEN (establece automáticamente -XX: + UseParallelGC) Y la colección de generación VIEJA
  3. Aplicar -XX: + UseParNewGC & -XX: + UseConcMarkSweepGC cuando necesite un método de recolección paralelo sobre la generación JOVEN Y requiera el método CMS como su colección sobre la memoria de la ANTIGUA generación
  4. No puede aplicar -XX: + UseParallelGC o -XX: + UseParallelOldGC con -XX: + UseConcMarkSweepGC simultáneamente, es por eso que su requiere -XX: + UseParNewGC para ser emparejado con CMS; de lo contrario, use -XX: + UseSerialGC explícitamente O -XX: - UseParNewGC si desea utilizar el método en serie contra la generación joven
Ivan Herlambang
fuente
Debe ser -XX:-UseParallelGC.
Minas Mina
Nota: La conclusión n. ° 1 ya no es correcta. La aplicación de -XX:+UseParallelGCclientes potenciales para usar GC en paralelo tanto para GC jóvenes como antiguos para JVM modernas. Ver bugs.openjdk.java.net/browse/…
turbanoff
15

UseParNewGC usualmente conocido como "recolector paralelo de generaciones jóvenes" es el mismo en todos los aspectos que el recolector de basura paralelo (-XX: + UseParallelGC), excepto que es más sofisticado y eficiente. También se puede utilizar con un "colector de pausa baja concurrente".

Consulte las preguntas frecuentes de Java GC , pregunta 22 para obtener más información.

Tenga en cuenta que hay algunos errores conocidos con UseParNewGC

Suraj Chandran
fuente
8
¿Sabes qué errores conocidos o qué versión de JVM los tiene?
fglez
4

El uso de -XX: + UseParNewGC junto con -XX: + UseConcMarkSweepGC provocará un mayor tiempo de pausa para los GC menores, en comparación con -XX: + UseParallelGC.

Esto se debe a que la promoción de objetos de generación joven a generación anterior requerirá ejecutar un algoritmo de ajuste óptimo (debido a la fragmentación de la generación anterior) para encontrar una dirección para este objeto.
No es necesario ejecutar un algoritmo de este tipo cuando se usa -XX: + UseParallelGC, ya que + UseParallelGC solo se puede configurar con MarkandCompact Collector, en cuyo caso no hay fragmentación.

Avinash Ganta
fuente
Esta es una idea realmente buena. ¿Realizaste alguna prueba para confirmarlo?
fglez