Perché i tempi di GC aumentano costantemente su un'app Java ad alto volume di lunga durata?


Ho un'applicazione Java ad alto volume che gestisce un carico costante di 50000msgs / sec. È sintonizzata per un throughput elevato utilizzando le seguenti impostazioni:

-Xmx3g -Xms3g -XX:NewSize=2g -Xss128k -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=90 -XX:+UseParallelGC -XX:ParallelGCThreads=12 -XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError

Sto scoprendo che il giovane GC times si insinua costantemente da 50ms quando inizia a 200ms entro la fine della giornata, anche se il la frequenza delle esecuzioni GC rimane la stessa.

Se provo la stessa esecuzione usando il collettore ParNewGC, i tempi di GC aumentano a un ritmo molto più veloce. Qualcuno ha qualche idea su questo problema?

Author: JoseK, 2010-09-09

2 answers

Se si ha una perdita di memoria, o una cache in memoria che sta gradualmente utilizzando sempre più memoria, questi avrebbero l'effetto di indurre il GC a fare più lavoro tracciando gli oggetti raggiungibili.

Altre possibilità sono:

  • Si ha una perdita di memoria non heap e ciò comporta un aumento del paging; cioè la copia di pagine di memoria fisica su disco e viceversa.

  • Alcuni processi esterni stanno consumando quantità crescenti di memoria, con conseguente aumento cercapersone.

  • La natura degli oggetti generati nelle giovani generazioni sta cambiando nel tempo in modo che sia necessario più lavoro per tracciare gli oggetti raggiungibili. Potrebbe essere semplicemente che una percentuale maggiore di loro sopravviva oltre la prima collezione.

 3
Author: Stephen C, 2013-04-20 03:27:06

Può essere una combinazione di diversi fattori:

  • Una perdita di memoria reale. (Gli oggetti sono ancora referenziati per caso)
  • Più oggetti, o forse una distribuzione diversa degli oggetti tra i pool gc.
  • L'heap è più grande. Tracciare il gc-time e la dimensione dell'heap.
  • Frammentazione della memoria. A livello di sistema operativo e / o l'heap java, a seconda della jvm.

Perché non si traccia il numero di oggetti, la dimensione dell'heap e il gc-time. (utilizzando uno strumento o interrogando MBeans) Una trama dovrebbe dirti la tendenza; crescente, decrescente o lineare, e ti aiuterà a determinare se c'è una perdita. Se possibile, scarica anche alcune statistiche dal tuo programma, come il numero di messaggi elaborati o sessioni attive, ecc.

È un problema reale dal momento che i tuoi messaggi non vengono elaborati durante gc?. Prova il segno simultaneo e spazzare gc...

* -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
 2
Author: KarlP, 2010-09-09 10:57:26