2010-09-09 1 views
8

Ho un'applicazione Java ad alto volume che gestisce un carico costante di 50000 msgs/sec. Si è sintonizzato per alta produttività utilizzando le seguenti impostazioni:Perché i tempi del GC aumentano costantemente su un'app Java ad alto volume di esecuzione elevata?

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

Sto scoprendo che i tempi di GC giovani aumentano costantemente di 50ms quando inizia a 200ms entro la fine della giornata, anche se la frequenza delle corse GC rimane la stessa.

Se provo la stessa esecuzione utilizzando il raccoglitore ParNewGC, i tempi del GC aumentano molto più rapidamente. Qualcuno ha qualche idea su questo problema?

+0

Nel corso del tempo peggiora nel tempo il giorno successivo, ad esempio, vai più di 200 ms o stai riavviando l'app ogni giorno? – JoseK

+0

Un'ipotesi, ma non è solo un effetto collaterale di NewSize che è davvero grande? GC-ing su 2 gig di oggetti sembra che ci vorrebbe un po '. – wds

risposta

3

Se si dispone di una perdita di memoria o di una cache in memoria che utilizza gradualmente sempre più memoria, ciò avrebbe l'effetto di indurre il GC a svolgere più lavoro nel tracciare gli oggetti raggiungibili.

Altre possibilità sono:

  • Hai un perdita di memoria non-heap, e che si traduce in aumento di paging; cioè copia di pagine di memoria fisica su disco e ritorno.

  • Alcuni processi esterni consumano quantità crescenti di memoria, con conseguente aumento del paging.

  • La natura degli oggetti generati nella giovane generazione sta cambiando nel tempo in modo che sia necessario più lavoro per rintracciare gli oggetti raggiungibili. Può essere semplicemente che una percentuale maggiore di essi sopravvive oltre la prima raccolta.

+0

Ho verificato che non ci siano perdite di memoria, i grafici delle generazioni giovani, di vecchia data e di vecchia data sono tutti periodici. –

2

Essa può essere una combinazione di diversi fattori:

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

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

È un problema reale poiché i tuoi messaggi non vengono elaborati durante gc ?. Prova il segno simultaneo e spazza gc ...

* -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 
+0

Sono abbastanza certo che questa non è una perdita di memoria perché posso vedere la giovane generazione oscillare da 100 MB a 2 GB, periodicamente. Praticamente tutto il carico di nuovi obiettivi viene eliminato nella stessa gen gen. Se imposto una dimensione di heap di un piccolo gen più piccolo, non sarei in grado di gestire un'improvvisa ondata di messaggi. –

+0

Ho provato -XX: + UseConcMarkSweepGC -XX: + UseParNewGC e il problema è peggiorato. Ho preso in considerazione la frammentazione della memoria, ma non sono sicuro di come accertare se questa è la causa. –

+0

Ho dovuto leggere la guida alla sintonizzazione gc, e indica che sia la gc parallela che ancor più la marcatura e lo sweep simultanei sono in realtà più probabili a causare la frammentazione. Così come è peggiorato durante l'uso di concMarkSweep, potrebbe indicare che è effettivamente la frammentazione che stai vedendo. Prova questi due suggerimenti dalla guida per vedere se migliora ... "La riduzione del numero di thread del garbage collector ridurrà questo effetto di frammentazione e aumenterà le dimensioni della generazione di tenured." – KarlP