java - 2gb - optifine jvm arguments
Diferencia entre-XX: UseParallelGC y-XX:+UseParNewGC (4)
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 elementos no utilizados de la generación titular simultánea (consulte Java Concurrent and Parallel GC ) pero, ¿hay alguna diferencia entre los dos algoritmos paralelos?
Después de mucha búsqueda, la mejor explicación que he encontrado es del sitio web 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 jóvenes
El recopilador de copias (original) (Habilitado de forma predeterminada). Cuando se activa este recopilador, todos los subprocesos de la aplicación se detienen, y la recopilación de copias continúa con un subproceso (lo que significa que solo hay una CPU aunque esté en una máquina con varias CPU). Esto se conoce como una colección stop-the-world, porque básicamente la JVM pausa todo lo demás hasta que se completa la colección.
El colector de copia paralelo (habilitado con -XX: + UseParNewGC). Al igual que el coleccionista de copias original, este es un coleccionista de parar el mundo. Sin embargo, este recopilador paraleliza la colección de copiado en varios subprocesos, que es más eficiente que el colector de copia original de un solo subproceso para máquinas con varias CPU (aunque no para máquinas con una sola CPU). Este algoritmo potencialmente acelera la recolección de la generación joven por un factor igual al número de CPU disponibles, en comparación con el colector de copia original de un solo subproceso.
El recopilador de eliminación paralela (habilitado con -XX: UseParallelGC). Esto es como el colector de copia 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 redimensionará automáticamente los espacios de almacenamiento dinámico. Si usa este recopilador, solo puede usar el recopilador de barrido de marca original en la generación anterior (es decir, el colector concurrente de generación anterior más nuevo no puede trabajar 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 ergonomics mientras que UseParNewGC no lo hace.
El uso de -XX: + UseParNewGC junto con -XX: + UseConcMarkSweepGC, causará 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 Young a Old Generation requerirá ejecutar un algoritmo Best-Fit (debido a la fragmentación de la generación anterior) para encontrar una dirección para este objeto.
No es necesario ejecutar dicho algoritmo cuando se usa -XX: + UseParallelGC, ya que + UseParallelGC se puede configurar solo con MarkandCompact Collector, en cuyo caso no hay fragmentación.
UseParNewGC normalmente se conoce como "colector de generación joven paralelo" 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 concurrente de baja pausa".
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
- XX: + UseParallelGC Utilice la recolección de basura paralela para los basureros. (Introducido en 1.4.1)
- XX: + UseParallelOldGC Usa 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 5.0)
UseParNewGC Se utiliza una versión paralela del recopilador de copia de generación joven con el recopilador simultáneo (es decir, si -XX: + UseConcMarkSweepGC se usa en la línea de comando y el indicador 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 combinaciones de algoritmos de recolección de basura hechos por Alexey Ragozin
<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:
- Aplicar -XX: + UseParallelGC cuando requiera un método de recolección en paralelo SOLAMENTE para la generación YOUNG , ( pero aún así) use el método de barrido de marca de serie como colección de generación ANTERIOR
- Aplique -XX: + UseParallelOldGC cuando requiera un método de recolección paralelo sobre la generación JOVEN (establece automáticamente -XX: + UseParallelGC) Y LA VIEJA colección de generación
- Aplicar -XX: + UseParNewGC & -XX: + UseConcMarkSweepGC cuando requiera un método de recolección paralelo sobre la generación YOUNG y requiera el método CMS como su colección sobre la memoria de generación OLD
- No puede aplicar -XX: + UseParallelGC o -XX: + UseParallelOldGC con -XX: + UseConcMarkSweepGC simultáneamente, es por eso que su requerimiento -XX: + UseParNewGC para ser emparejado con CMS de lo contrario use -XX: + UseSerialGC explícitamente O -XX: - UseParNewGC si desea utilizar el método serial contra la generación joven