2010-11-04 12 views
10

Actualmente estoy enfrentando el problema de que mi aplicación muestra tiempos largos de GC esporádicamente, pero todo esto solo es causado por un procesamiento de referencia débil. Por lo tanto, el tiempo detenido en el hilo siempre está cerca del tiempo de procesamiento de ref débil. Todos los demás ciclos de GC son de 0.0001 segundos a 0.200 segundos.¿Cómo puedo reducir el tiempo de procesamiento de ref débil durante el GC?

Desde el gc.log (reordenada):

10388.186: [GC[YG occupancy: 206547 K (306688 K)]10388.186: [Rescan (parallel) , 
0.1095860 secs]10388.295: [weak refs processing, 2.0799570 secs] 
[1 CMS-remark: 2973838K(3853568K)] 3180386K(4160256K), 2.1899230 secs] 
[Times: user=2.51 sys=0.00, real=2.18 secs] 
Total time for which application threads were stopped: 2.1906890 seconds 

Actualmente tengo estos ajustes en su lugar. Intentó una configuración más simple, pero sin cambios.

-Xms4g 
-Xmx4g 
-XX:NewSize=128m 
-XX:+UseConcMarkSweepGC 
-XX:+CMSIncrementalMode 
-XX:MaxGCPauseMillis=50 
-XX:CMSInitiatingOccupancyFraction=50 
-XX:ParallelGCThreads=16 
-XX:+DisableExplicitGC 

Si enciendo NewSize, termino con ciclos de GC largos normales. La máquina tiene 8 núcleos y no quema tanta CPU para la aplicación. Intenté hacer funcionar el GC viejo gen temprano y concurrentemente.

Y sí, no puedo deshacerme del uso de ref débil, porque esto es parte de una biblioteca de terceros.

Respuesta

7

Encontré this message en la lista de distribución "hotspot-gc-use".

En resumen, pruebe el interruptor -XX:+ParallelRefProcEnabled.


ACTUALIZACIÓN

I conocer una mejor explicación en Jon Masamitsu de Weblog:

6) de procesamiento de referencia paralelo en el colector de baja pausa.

Para una aplicación que utiliza objetos Reference ampliamente, el GC para procesar los objetos de referencia puede ser notable. No es necesariamente peor en el colector de baja pausa que en el otro recoge, pero duele más (porque estamos tratando de mantener las pausas bajas). El procesamiento de referencia paralelo está disponible para el colector de pausa baja pero no está activado por defecto. A menos que haya toneladas de objetos de referencia, hacer el procesamiento de referencia en serie suele ser más rápido. Enciéndalo con la bandera -XX:+ParallelRefProcEnabled si hace un uso extensivo de los objetos Reference (la mayoría de las aplicaciones no lo hacen).

+0

Genial. Voy a probar esto mañana por la mañana. – ReneS

+0

Tenga en cuenta el formato correcto: -XX: + ParallelRefProcEnabled – ReneS

+0

¡Ayudas! Los tiempos son ahora de 0.2 a 0.5 y parecen ser predecibles. ¡Increíble! – ReneS

Cuestiones relacionadas