java garbage-collection glassfish jvm

java - Problemas de JVM GC



garbage-collection glassfish (3)

En las últimas semanas he estado probando diferentes ajustes de JVM para mi servidor de Glassfish. Las configuraciones principales para heap (entre otras) son: -Xms512m, -Xmx512m, -XX: NewRatio = 2. Probé con diferentes configuraciones de GC, pero todavía tengo problemas con largas pausas después de algunos días desde que inicie el servidor. Me di cuenta de lo siguiente:
1. -XX: + UseParallelGC -XX: + UseParallelOldGC: cada GC menor ocurría cada minuto, GC mayor cada 18 horas. No tuve problemas con el GC menor, pero hubo problemas con GC mayor después de 5 días. Al principio, las principales pausas de la GC duraron entre 100 y 200 ms, pero al final la última pausa duró 70 segundos.
2. -XX: + UseConcMarkSweepGC -XX: + UseParNewGC - casi igual que el anterior. Los GC menores estaban bien, pero las pausas principales de GC (no completas) se estaban haciendo muy largas. Noté problemas con la descarga de clase alta en la fase GC (Observación final del CMS) que es detener la fase mundial.
3. -XX: + UseConcMarkSweepGC -XX: + UseParNewGC y -XX: MaxGCPauseMillis = 5000. Estuve probando esto solo por un día porque el segundo gran GC (no completo) ya duró unos 20 segundos, así que pensé que había algo más.
4. -XX: + UseG1GC, -XX: MaxGCPauseMillis = 5000, -XX: + UseStringDeduplication sin -XX: NewRatio = 2 opción - el GC principal (no completo) se produce cada 12 horas, ya he notado algunos problemas:

2015-05-31T18:25:25.145+0200: 83383.897: [GC concurrent-mark-start] 2015-05-31T18:25:35.563+0200: 83394.312: [GC concurrent-mark-end, 10.4145795 secs] 2015-05-31T18:25:35.563+0200: 83394.312: [GC remark 83394.312: [Finalize Marking, 0.0002939 secs] 83394.312: [GC ref-proc, 1.2128584 secs] 83395.525: [Unloading, 14.5180500 secs], 15.7320854 secs] [Times: user=0.14 sys=0.22, real=15.73 secs]

La fase de observación de GC tomó 15 segundos, lo cual no es aceptable para mí. Puede ver que la descarga tomó la mayor parte del tiempo. Eso también sucedió antes cuando usé otro GC así que creo que debe haber un problema con la descarga de clases.

Resumen: todos los GC funcionaron bien por algún tiempo pero después de algunos días los problemas comenzaron a aparecer con tiempos de pausa largos. No sé por qué funciona bien los primeros días y de repente los resultados son muy malos. Noté que un mayor tiempo de pausa fue causado por la descarga de clases, así que me pregunto si hay alguna configuración para obtener mejores resultados. También quiero saber qué GC me estás recomendando usar? Tengo una aplicación web interna que se ejecuta en el servidor glassfish en PC con 8 gb de RAM, procesador i7 y con el sistema operativo Windows 8. Habrá una conexión máxima de 10 clientes al mismo tiempo, pero debe tener un tiempo de funcionamiento prolongado y no puede haber largos tiempos de pausa (máximo 5 segundos). Por favor, avíseme qué más puedo hacer para obtener tiempos de pausa más cortos.

Y una pregunta más: ¿qué podría ser una desventaja al utilizar G1GC en lugar de CMS o ParallelGC en mi caso? ¿El montón es pequeño para usar G1GC?

EDITAR: Registro G1GC justo antes y después de una larga pausa Fase de observación del GC

2015-05-31T18:25:25.004+0200: 83383.755: [GC pause (G1 Evacuation Pause) (young) (initial-mark), 0.1280453 secs] [Parallel Time: 116.2 ms, GC Workers: 4] [GC Worker Start (ms): Min: 83383757.6, Avg: 83383757.7, Max: 83383757.7, Diff: 0.0] [Ext Root Scanning (ms): Min: 97.8, Avg: 98.3, Max: 98.5, Diff: 0.7, Sum: 393.1] [Update RS (ms): Min: 0.2, Avg: 4.0, Max: 14.8, Diff: 14.6, Sum: 16.1] [Processed Buffers: Min: 1, Avg: 6.0, Max: 16, Diff: 15, Sum: 24] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.1] [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Object Copy (ms): Min: 0.2, Avg: 2.5, Max: 3.7, Diff: 3.5, Sum: 10.2] [Termination (ms): Min: 0.0, Avg: 8.5, Max: 11.4, Diff: 11.4, Sum: 34.2] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [GC Worker Total (ms): Min: 113.4, Avg: 113.4, Max: 113.5, Diff: 0.0, Sum: 453.8] [GC Worker End (ms): Min: 83383871.1, Avg: 83383871.1, Max: 83383871.1, Diff: 0.0] [Code Root Fixup: 0.1 ms] [Code Root Purge: 0.0 ms] [String Dedup Fixup: 2.2 ms, GC Workers: 4] [Queue Fixup (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Table Fixup (ms): Min: 2.0, Avg: 2.1, Max: 2.1, Diff: 0.1, Sum: 8.3] [Clear CT: 0.1 ms] [Other: 9.5 ms] [Choose CSet: 0.0 ms] [Ref Proc: 8.8 ms] [Ref Enq: 0.1 ms] [Redirty Cards: 0.3 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.1 ms] [Eden: 215.0M(215.0M)->0.0B(215.0M) Survivors: 7168.0K->7168.0K Heap: 451.5M(512.0M)->236.6M(512.0M)] [Times: user=0.08 sys=0.02, real=0.13 secs] 2015-05-31T18:25:25.129+0200: 83383.883: [GC concurrent-root-region-scan-start] 2015-05-31T18:25:25.129+0200: 83383.883: [GC concurrent-string-deduplication, 160.0B->0.0B(160.0B), avg 48.3%, 0.0000070 secs] [Last Exec: 0.0000070 secs, Idle: 23.1834927 secs, Blocked: 0/0.0000000 secs] [Inspected: 3] [Skipped: 0( 0.0%)] [Hashed: 3(100.0%)] [Known: 0( 0.0%)] [New: 3(100.0%) 160.0B] [Deduplicated: 3(100.0%) 160.0B(100.0%)] [Young: 3(100.0%) 160.0B(100.0%)] [Old: 0( 0.0%) 0.0B( 0.0%)] [Total Exec: 2868/0.1946124 secs, Idle: 2868/83382.9701762 secs, Blocked: 13/0.0032760 secs] [Inspected: 304493] [Skipped: 0( 0.0%)] [Hashed: 163708( 53.8%)] [Known: 44808( 14.7%)] [New: 259685( 85.3%) 21.9M] [Deduplicated: 160467( 61.8%) 10.6M( 48.3%)] [Young: 83546( 52.1%) 6270.6K( 57.8%)] [Old: 76921( 47.9%) 4571.3K( 42.2%)] [Table] [Memory Usage: 4291.8K] [Size: 131072, Min: 1024, Max: 16777216] [Entries: 133319, Load: 101.7%, Cached: 6107, Added: 142389, Removed: 9070] [Resize Count: 7, Shrink Threshold: 87381(66.7%), Grow Threshold: 262144(200.0%)] [Rehash Count: 0, Rehash Threshold: 120, Hash Seed: 0x0] [Age Threshold: 3] [Queue] [Dropped: 0] 2015-05-31T18:25:25.145+0200: 83383.897: [GC concurrent-root-region-scan-end, 0.0140467 secs] 2015-05-31T18:25:25.145+0200: 83383.897: [GC concurrent-mark-start] 2015-05-31T18:25:35.563+0200: 83394.312: [GC concurrent-mark-end, 10.4145795 secs] 2015-05-31T18:25:35.563+0200: 83394.312: [GC remark 83394.312: [Finalize Marking, 0.0002939 secs] 83394.312: [GC ref-proc, 1.2128584 secs] 83395.525: [Unloading, 14.5180500 secs], 15.7320854 secs] [Times: user=0.14 sys=0.22, real=15.73 secs] 2015-05-31T18:25:51.288+0200: 83410.045: [GC cleanup 334M->326M(512M), 0.2836092 secs] [Times: user=0.00 sys=0.00, real=0.28 secs] 2015-05-31T18:25:51.570+0200: 83410.328: [GC concurrent-cleanup-start] 2015-05-31T18:25:51.570+0200: 83410.328: [GC concurrent-cleanup-end, 0.0000669 secs] 2015-05-31T18:26:03.732+0200: 83422.482: [GC pause (G1 Evacuation Pause) (young), 0.1031257 secs] [Parallel Time: 91.6 ms, GC Workers: 4] [GC Worker Start (ms): Min: 83422481.7, Avg: 83422481.7, Max: 83422481.8, Diff: 0.0] [Ext Root Scanning (ms): Min: 1.3, Avg: 1.7, Max: 2.7, Diff: 1.4, Sum: 6.9] [Update RS (ms): Min: 0.0, Avg: 22.7, Max: 89.8, Diff: 89.8, Sum: 90.8] [Processed Buffers: Min: 0, Avg: 7.3, Max: 15, Diff: 15, Sum: 29] [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.2] [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Object Copy (ms): Min: 0.5, Avg: 2.4, Max: 3.4, Diff: 2.9, Sum: 9.5] [Termination (ms): Min: 0.0, Avg: 64.7, Max: 86.3, Diff: 86.3, Sum: 258.9] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1] [GC Worker Total (ms): Min: 91.6, Avg: 91.6, Max: 91.6, Diff: 0.0, Sum: 366.3] [GC Worker End (ms): Min: 83422573.3, Avg: 83422573.3, Max: 83422573.3, Diff: 0.0] [Code Root Fixup: 0.1 ms] [Code Root Purge: 0.0 ms] [String Dedup Fixup: 2.1 ms, GC Workers: 4] [Queue Fixup (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Table Fixup (ms): Min: 1.9, Avg: 1.9, Max: 1.9, Diff: 0.1, Sum: 7.7] [Clear CT: 0.1 ms] [Other: 9.3 ms] [Choose CSet: 0.0 ms] [Ref Proc: 8.8 ms] [Ref Enq: 0.1 ms] [Redirty Cards: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.1 ms] [Eden: 215.0M(215.0M)->0.0B(19.0M) Survivors: 7168.0K->6144.0K Heap: 443.6M(512.0M)->228.2M(512.0M)] [Times: user=0.30 sys=0.01, real=0.10 secs] 2015-05-31T18:26:03.848+0200: 83422.597: [GC concurrent-string-deduplication, 160.0B->0.0B(160.0B), avg 48.3%, 0.0123951 secs] [Last Exec: 0.0123951 secs, Idle: 38.7017788 secs, Blocked: 0/0.0000000 secs] [Inspected: 3] [Skipped: 0( 0.0%)] [Hashed: 3(100.0%)] [Known: 0( 0.0%)] [New: 3(100.0%) 160.0B] [Deduplicated: 3(100.0%) 160.0B(100.0%)] [Young: 3(100.0%) 160.0B(100.0%)] [Old: 0( 0.0%) 0.0B( 0.0%)] [Total Exec: 2869/0.2070075 secs, Idle: 2869/83421.6719550 secs, Blocked: 13/0.0032760 secs] [Inspected: 304496] [Skipped: 0( 0.0%)] [Hashed: 163711( 53.8%)] [Known: 44808( 14.7%)] [New: 259688( 85.3%) 21.9M] [Deduplicated: 160470( 61.8%) 10.6M( 48.3%)] [Young: 83549( 52.1%) 6270.8K( 57.8%)] [Old: 76921( 47.9%) 4571.3K( 42.2%)] [Table] [Memory Usage: 2565.5K] [Size: 65536, Min: 1024, Max: 16777216] [Entries: 81061, Load: 123.7%, Cached: 6553, Added: 142396, Removed: 61335] [Resize Count: 8, Shrink Threshold: 43690(66.7%), Grow Threshold: 131072(200.0%)] [Rehash Count: 0, Rehash Threshold: 120, Hash Seed: 0x0] [Age Threshold: 3] [Queue] [Dropped: 0] 2015-05-31T18:26:05.769+0200: 83424.518: [GC pause (G1 Evacuation Pause) (mixed), 0.2232916 secs] [Parallel Time: 216.7 ms, GC Workers: 4] [GC Worker Start (ms): Min: 83424518.3, Avg: 83424518.3, Max: 83424518.3, Diff: 0.0] [Ext Root Scanning (ms): Min: 1.2, Avg: 1.6, Max: 2.6, Diff: 1.4, Sum: 6.5] [Update RS (ms): Min: 0.0, Avg: 0.3, Max: 0.4, Diff: 0.4, Sum: 1.2] [Processed Buffers: Min: 0, Avg: 4.3, Max: 7, Diff: 7, Sum: 17] [Scan RS (ms): Min: 56.1, Avg: 102.3, Max: 144.4, Diff: 88.3, Sum: 409.2] [Code Root Scanning (ms): Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 0.3] [Object Copy (ms): Min: 50.4, Avg: 97.6, Max: 157.7, Diff: 107.2, Sum: 390.2] [Termination (ms): Min: 0.0, Avg: 14.8, Max: 19.8, Diff: 19.8, Sum: 59.1] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1] [GC Worker Total (ms): Min: 216.6, Avg: 216.6, Max: 216.6, Diff: 0.0, Sum: 866.5] [GC Worker End (ms): Min: 83424734.9, Avg: 83424734.9, Max: 83424734.9, Diff: 0.0] [Code Root Fixup: 0.1 ms] [Code Root Purge: 0.0 ms] [String Dedup Fixup: 1.5 ms, GC Workers: 4] [Queue Fixup (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Table Fixup (ms): Min: 1.4, Avg: 1.4, Max: 1.4, Diff: 0.0, Sum: 5.6] [Clear CT: 0.2 ms] [Other: 4.8 ms] [Choose CSet: 0.0 ms] [Ref Proc: 0.9 ms] [Ref Enq: 0.0 ms] [Redirty Cards: 0.2 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.2 ms] [Eden: 19.0M(19.0M)->0.0B(21.0M) Survivors: 6144.0K->4096.0K Heap: 247.2M(512.0M)->175.2M(512.0M)] [Times: user=0.09 sys=0.00, real=0.22 secs] 2015-05-31T18:26:05.992+0200: 83424.742: [GC concurrent-string-deduplication, 640.0B->152.0B(488.0B), avg 48.3%, 0.0000246 secs] [Last Exec: 0.0000246 secs, Idle: 2.1442834 secs, Blocked: 0/0.0000000 secs] [Inspected: 6] [Skipped: 0( 0.0%)] [Hashed: 5( 83.3%)] [Known: 0( 0.0%)] [New: 6(100.0%) 640.0B] [Deduplicated: 5( 83.3%) 488.0B( 76.3%)] [Young: 5(100.0%) 488.0B(100.0%)] [Old: 0( 0.0%) 0.0B( 0.0%)] [Total Exec: 2870/0.2070321 secs, Idle: 2870/83423.8162384 secs, Blocked: 13/0.0032760 secs] [Inspected: 304502] [Skipped: 0( 0.0%)] [Hashed: 163716( 53.8%)] [Known: 44808( 14.7%)] [New: 259694( 85.3%) 21.9M] [Deduplicated: 160475( 61.8%) 10.6M( 48.3%)] [Young: 83554( 52.1%) 6271.2K( 57.8%)] [Old: 76921( 47.9%) 4571.3K( 42.2%)] [Table] [Memory Usage: 2564.6K] [Size: 65536, Min: 1024, Max: 16777216] [Entries: 81026, Load: 123.6%, Cached: 6553, Added: 142397, Removed: 61371] [Resize Count: 8, Shrink Threshold: 43690(66.7%), Grow Threshold: 131072(200.0%)] [Rehash Count: 0, Rehash Threshold: 120, Hash Seed: 0x0] [Age Threshold: 3] [Queue] [Dropped: 0] 2015-05-31T18:26:08.157+0200: 83426.906: [GC pause (G1 Evacuation Pause) (mixed), 0.6216666 secs] [Parallel Time: 618.5 ms, GC Workers: 4] [GC Worker Start (ms): Min: 83426906.5, Avg: 83426906.5, Max: 83426906.5, Diff: 0.0] [Ext Root Scanning (ms): Min: 0.3, Avg: 8.0, Max: 15.7, Diff: 15.3, Sum: 31.9] [Update RS (ms): Min: 0.0, Avg: 4.5, Max: 8.5, Diff: 8.5, Sum: 17.9] [Processed Buffers: Min: 0, Avg: 7.0, Max: 18, Diff: 18, Sum: 28] [Scan RS (ms): Min: 13.4, Avg: 28.4, Max: 65.2, Diff: 51.8, Sum: 113.7] [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.2] [Object Copy (ms): Min: 532.6, Avg: 577.3, Max: 604.5, Diff: 71.9, Sum: 2309.1] [Termination (ms): Min: 0.0, Avg: 0.2, Max: 0.3, Diff: 0.3, Sum: 0.7] [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1] [GC Worker Total (ms): Min: 618.4, Avg: 618.4, Max: 618.4, Diff: 0.0, Sum: 2473.6] [GC Worker End (ms): Min: 83427524.9, Avg: 83427524.9, Max: 83427524.9, Diff: 0.0] [Code Root Fixup: 0.1 ms] [Code Root Purge: 0.0 ms] [String Dedup Fixup: 1.3 ms, GC Workers: 4] [Queue Fixup (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0] [Table Fixup (ms): Min: 1.2, Avg: 1.2, Max: 1.3, Diff: 0.1, Sum: 4.9] [Clear CT: 0.1 ms] [Other: 1.6 ms] [Choose CSet: 0.0 ms] [Ref Proc: 1.0 ms] [Ref Enq: 0.0 ms] [Redirty Cards: 0.0 ms] [Humongous Reclaim: 0.0 ms] [Free CSet: 0.2 ms] [Eden: 21.0M(21.0M)->0.0B(21.0M) Survivors: 4096.0K->4096.0K Heap: 196.2M(512.0M)->129.4M(512.0M)] [Times: user=0.08 sys=0.02, real=0.62 secs]

EDITAR: Resultados después de algunas horas:

Hay una gran cantidad de páginas / seg. Y páginas de entrada / seg. Y también un error de página. ¿Esto es normal? ¿Dónde puedo configurar las páginas / seg y las páginas de entrada / seg solo para JVM (solo encontré las páginas con fallas)?


[Veces: usuario = 0,14 sys = 0,22, real = 15,73 segundos]

Esto significa que gasta mucho más GCing de pared que el tiempo de CPU real. Todos los GC que ha probado son de subprocesos múltiples y están limitados a CPU, lo que significa que, en general, deben grabar más tiempo de CPU que el tiempo de pared.

Hay dos causas posibles que cambiarían eso

  • La inanición de recursos, ya sea parte del almacenamiento dinámico se intercambia o los demás procesos ocupan las CPU. Como sugiere @Mikaveli , use las herramientas de monitoreo del sistema operativo para obtener más información.
  • Algo impide que la máquina virtual llegue a un punto seguro por varios segundos. Puede verificarlo con -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1

Además, como sucedió durante una pausa de observación usando -XX:-ClassUnloadingWithConcurrentMark podría arreglarlo, pero supongo que simplemente cambiaría el problema a un GC normal.

Y tal vez sería útil rastrear cuánto está intentando descargar con -XX:+TraceClassUnloading . Los contenedores de aplicaciones como glassfish podrían estar haciendo cosas raras que provocan la acumulación de muchas clases.

Editar: para la monitorización, lo que más desea es controlar la memoria física libre (cachés menos), la carga de la CPU , la entrada / salida de página / las fallas. Supervise idealmente la paginación en el nivel de proceso, ya que no concierne a la JVM si otro proceso está esperando los discos.

En cuanto a CMS vs. G1: eso probablemente no esté relacionado con tu problema.


Supongo que estás ladrando el árbol equivocado, sospecho que Garbage Collection no es tu problema ...

Solo está ejecutando un montón de 512 MiB; para mí, una pausa larga con un montón de ese tamaño sería de 1 o 2 segundos. Las pausas principales en milisegundos son posibles con montones grandes (32 GiB).

Espero que el problema sea realmente con su servidor: las otras aplicaciones que mencionó están usando suficiente memoria para impulsar su proceso Java (que será alrededor de un 50% más grande que el montón) en intercambio / memoria virtual, o usted está ejecutando su aplicación en un entorno virtualizado (posiblemente con problemas de sobrecarga de memoria / balooning de memoria).

Como un indicador realmente crudo, cualquier algoritmo GC debería poder batir a través de 100 MiB de montón por segundo, así que si estás viendo algo peor que eso, busca en otra parte la causa del problema.

En este caso, creo que GC es el síntoma, no el problema.


Eche un vistazo a este artículo y podría decir en qué área principal se encontraría la larga pausa de GC en su caso (el artículo tiene algunos pasos sobre cómo determinar esto). ¿Fragmentación? Otras actividades del sistema operativo?

Además, podría deberse a un error de JVM. Compruebe la versión de JVM que tiene.

Enlace: https://blogs.oracle.com/poonam/entry/troubleshooting_long_gc_pauses