Posterior a de una prolongada selección de información resolvimos este atasco que presentan algunos de nuestros usuarios. Te regalamos la solución y nuestro objetivo es servirte de mucha apoyo.
Solución:
Después de mucho buscar, la mejor explicación que he encontrado es del sitio web Java Performance Tuning en 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
Él Coleccionista de copias (originales) (Habilitado por defecto). Cuando este recopilador se activa, todos los subprocesos de la aplicación se detienen y la recopilación de copias continúa utilizando un subproceso (lo que significa solo una CPU, incluso si se trata de una máquina con varias CPU). Esto se conoce como colección stop-the-world, porque básicamente la JVM detiene todo lo demás hasta que se completa la colección.
Él colector de copia paralela (Habilitado usando -XX:+UseParNewGC). Al igual que el coleccionista de copias originales, este es un coleccionista que detiene el mundo. Sin embargo, este recopilador paraleliza la recopilación de copias en varios subprocesos, lo que es más eficiente que el recopilador de copias original de subproceso único para máquinas con múltiples CPU (aunque no para máquinas con una sola CPU). Este algoritmo acelera potencialmente la recopilación de generación joven en un factor igual a la cantidad de CPU disponibles, en comparación con el recopilador de copia de subproceso único original.
Él colector de barrido paralelo (Habilitado usando -XX:UseParallelGC). Esto es como el recopilador de copia 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 usa este recopilador, solo puede usar el recopilador de barrido de marcas original en la generación anterior (es decir, el recopilador concurrente de generación anterior más nuevo no puede funcionar con este recopilador de generación joven).
A partir de esta información, parece que la principal diferencia (aparte de la cooperación con CMS) es que UseParallelGC es compatible con la ergonomía mientras que UseParNewGC no.
GC paralelo
- XX:+UseParallelGC Utilice la recolección de basura en paralelo para los borrados. (Introducido en 1.4.1)
- XX:+UseParallelOldGC Utilice la recolección de basura paralela para las colecciones completas. Habilitar esta opción establece automáticamente -XX:+UseParallelGC. (Introducido en la actualización 5.0 6.)
UsarParNewGC
UsarParNewGC
Se usa una versión paralela del recopilador de copia de generación joven con el recopilador concurrente (es decir, si -XX:+ UseConcMarkSweepGC se usa en la línea de comando, entonces el indicador UseParNewGC también se establece en true
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 creados por Alexey Ragozin.
Young collector
Old collector
JVM option
Serial (DefNew)
Serial Mark-Sweep-Compact
-XX:+UseSerialGC
Parallel scavenge (PSYoungGen)
Serial Mark-Sweep-Compact (PSOldGen)
-XX:+UseParallelGC
Parallel scavenge (PSYoungGen)
Parallel Mark-Sweep-Compact (ParOldGen)
-XX:+UseParallelOldGC
Serial (DefNew)
Concurrent Mark Sweep
-XX:+UseConcMarkSweepGC
-XX:-UseParNewGC
Parallel (ParNew)
Concurrent Mark Sweep
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
G1
-XX:+UseG1GC
Conclusión:
- Aplique -XX:+UseParallelGC cuando necesite un método de recopilación en paralelo JOVEN generación SOLAMENTE(pero todavía) utilice el método serial-mark-sweep como ANTIGUO colección de generación
- Aplique -XX:+UseParallelOldGC cuando necesite un método de recopilación en paralelo JOVEN generación (establece automáticamente -XX:+UseParallelGC) YANTIGUO colección de generación
- Aplique -XX:+UseParNewGC & -XX:+UseConcMarkSweepGC cuando necesite un método de recopilación en paralelo JOVEN generación Y requiere el método CMS como su colección sobre ANTIGUO memoria de generación
- No puede aplicar -XX:+UseParallelGC o -XX:+UseParallelOldGC con -XX:+UseConcMarkSweepGC simultáneamente, es por eso que necesita -XX:+UseParNewGC para emparejarse con CMS; de lo contrario, use -XX:+UseSerialGC explícitamente O -XX:–UseParNewGC si desea usar el método en serie contra la generación joven
UseParNewGC, generalmente conocido como “recolector paralelo de generación joven”, es igual en todos los sentidos que el recolector de basura paralelo (-XX:+UseParallelGC), excepto que es más sofisticado y eficiente. También se puede usar con un “colector de pausa baja concurrente”.
Consulte Preguntas frecuentes sobre Java GC, pregunta 22 para obtener más información.
Tenga en cuenta que hay algunos errores conocidos con UseParNewGC
Más adelante puedes encontrar las crónicas de otros programadores, tú igualmente puedes insertar el tuyo si lo crees conveniente.