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.
GC paralelo
UseParNewGC
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
Mostrar fragmento de código
<table border="1" style="width:100%"> <tr> <td align="center">Young collector</td> <td align="center">Old collector</td> <td align="center">JVM option</td> </tr> <tr> <td>Serial (DefNew)</td> <td>Serial Mark-Sweep-Compact</td> <td>-XX:+UseSerialGC</td> </tr> <tr> <td>Parallel scavenge (PSYoungGen)</td> <td>Serial Mark-Sweep-Compact (PSOldGen)</td> <td>-XX:+UseParallelGC</td> </tr> <tr> <td>Parallel scavenge (PSYoungGen)</td> <td>Parallel Mark-Sweep-Compact (ParOldGen)</td> <td>-XX:+UseParallelOldGC</td> </tr> <tr> <td>Serial (DefNew)</td> <td>Concurrent Mark Sweep</td> <td> <p>-XX:+UseConcMarkSweepGC</p> <p>-XX:-UseParNewGC</p> </td> </tr> <tr> <td>Parallel (ParNew)</td> <td>Concurrent Mark Sweep</td> <td> <p>-XX:+UseConcMarkSweepGC</p> <p>-XX:+UseParNewGC</p> </td> </tr> <tr> <td colspan="2">G1</td> <td>-XX:+UseG1GC</td> </tr> </table>
Conclusión:
fuente
-XX:-UseParallelGC
.-XX:+UseParallelGC
clientes potenciales para usar GC en paralelo tanto para GC jóvenes como antiguos para JVM modernas. Ver bugs.openjdk.java.net/browse/…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
fuente
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.
fuente