weakreference java garbage-collection weak-references

java - weakreference c#



¿Qué hice que hizo que el "procesamiento de ref débil" dure 30 segundos en lugar de 1,5 segundos? (1)

La historia

Mi servidor se ejecuta con procesadores de 24x2, y el montón de Java tiene aproximadamente 70 GB. En algún momento después de instalar una nueva versión (versión-B), vi que Full GC tomaba alrededor de 30 segundos (deteniendo todos los hilos). Después de habilitar XX: + ParallelRefProcEnabled, el proceso de ref débil descendió a alrededor de 3-6 segundos. Pero esto es solo una "ayuda de Bend", no una cura.

2011-03-22T20: 38: 24.276 + 0000: 29540.794: [Ocupación GC [YG: 5477281 K (7549760 K)] 29540.794: [Volver a escanear (paralelo), 0.4083780 segundos] 29541.203: [procesamiento de ref débil, 3.2855240 secs] 29544.488: [descarga de clase, 0.0187270 segundos] 29544.507: [símbolo de limpieza y tablas de cadena, 0.0095530 segundos] [1 comentario de CMS: 102801236K (114294784K)] 108278518K (121844544K), 3.7319690 segundos] [Tiempos: usuario = 65.53 sys = 0.14, real = 3.73 segundos]

Antes de la versión B (y sin el indicador ParallelRefProcEnabled), el proceso de ref débil tardaba aproximadamente 1,5 segundos. (Para aproximadamente la misma carga)

El propósito:

Lo que trato de averiguar es qué cambio introdujo la versión B que provocó que el procesamiento saltara de 1.5 a 30 segundos. Hay algunos cambios en la versión B y ningún sospechoso real que involucre referencias débiles.

Quiero cambiar mi código para que no se retransmita en el procesamiento de ref débil y pesado.

Preguntas:

  • Me gustaría entender qué está sucediendo exactamente en la etapa de "procesamiento de ref débil", para poder buscar un sospechoso o justificar la reescritura de un código. ¿Algún buen recurso para leer sobre lo que sucede exactamente en esa etapa?

  • ¿Cuáles son las posibles causas del largo "procesamiento de ref débil"? (Número de instancias de referencias débiles, número de objetos que contienen una referencia débil, profundidad del árbol de referencia al que se hace referencia débilmente, ...)

Más información:

  • El uso de la CPU no es tan alto y no parece ser un problema
  • El GC (que incluye procesamiento de referencia débil) ocurre aproximadamente cada 8 minutos.
  • Ejecutando Java Sun, 1.6.0_20

Agradecería cualquier respuesta, gracias, Erez.


AFAIK, el tiempo de procesamiento de referencia es el tiempo que lleva determinar si se puede recopilar o no una referencia. Esto debería ser proporcional al número de WeakReferences que tenga.

Puede ser que sea posible un cambio en la estructura de los datos, lo que reduce drásticamente el número de referencias débiles. por ejemplo, decir que tienes un caché usando Map of WeakReferences. Si esto se puede reemplazar con una WeakReference a un mapa, puede obtener el mismo resultado pero con menos referencias.

Puede ver una mejora en el rendimiento con la actualización 24 de Java 6 que tiene una JVM mucho más nueva (aproximadamente un año más reciente)