resueltos programacion patrones libro hilos evitar ejemplos concurrente concurrencia barreras java garbage-collection concurrency

patrones - programacion concurrente java pdf



Java concurrente y paralelo GC (6)

No puede habilitar dos opciones de GC al mismo tiempo. Le sugiero que use CMS, que es mejor que, y la próxima generación de GC se compara con UseParNewGC. y si usa Java 1.7 o posterior y el tamaño del almacenamiento dinámico es relativamente más grande (como> 4 GB), considere usar G1.

Este artículo sugiere usar -XX:+UseParNewGC "para habilitar un GC de generación joven paralelo con el GC concurrente".

Mi confusión es que para habilitar tanto el GC paralelo como el concurrente, ¿debería

  • use -XX:+UseParNewGC o
  • use ambos -XX:+UseParNewGC y -XX:+UseConcMarkSweepGC ?

PD

Estoy usando JVM 6.


Como el documento que vinculó era para una VM 1.4.2, supongo que lo está utilizando (las JVM 5 y 6 se comportan de forma diferente).

Desde http://java.sun.com/docs/hotspot/gc1.4.2/

si -XX: + UseConcMarkSweepGC se usa en la línea de comando, entonces la bandera UseParNewGC también se establece en verdadero si no se establece explícitamente en la línea de comando

Entonces la respuesta es que solo necesita usar -XX: + UseConcMarkSweepGC y habilitará el recopilador simultáneo con el colector de generación joven paralelo.

Editar: para Java 6, el mismo marcador (-XX: + UseConcMarkSweepGC) habilita el recopilador concurrente. La elección del recopilador que desee depende de algunas cosas, y debe probar diferentes configuraciones. Pero hay algunas pautas muy generales. Si tiene un solo procesador, una máquina de un solo hilo, entonces debe usar el colector serial (por defecto para algunas configuraciones, puede habilitarse explícitamente para -XX: + UseSerialGC). Para máquinas multiprocesador donde su carga de trabajo está básicamente vinculada a la CPU, use el colector paralelo. Esto está habilitado por defecto si usa el indicador -server, o puede habilitarlo explícitamente con -XX: + UseParallelGC. Si prefiere mantener las pausas del GC más cortas a expensas de usar más tiempo total de CPU para GC, y tiene más de una CPU, puede usar el recopilador simultáneo (-XX: + UseConcMarkSweepGC). Tenga en cuenta que el recopilador simultáneo tiende a requerir más RAM asignada a la JVM que los colectores en serie o paralelos para una carga de trabajo dada porque puede producirse cierta fragmentación de la memoria.




La sintonización de Java GC es básicamente un arte oscuro, pero en mi aplicación (se ejecuta con un montón de 50 + GB y 16 núcleos físicos) el recopilador ConcMarkSweep dio como resultado una aceleración de 3x sobre el valor predeterminado del servidor, y una aceleración de 2.2x sobre ParallelOldGC.

Si no está compartiendo la máquina con otros procesos (por lo tanto, los núcleos inactivos se desperdician) utilice el ConcMarkSweepGC.


ParNew es el recopilador de generación joven predeterminado cuando se usa CMS. Solo tiene que especificar -XX: + UseConcMarkSweepGC para usar CMS y ParNew se usará de manera predeterminada. CMS es un buen recopilador si evitar el jitter de GC es de mayor prioridad, pero si el rendimiento es más importante, por ejemplo, para un trabajo por lotes, el colector paralelo SUN predeterminado hace un mejor trabajo.