2013-04-01 7 views
8

Durante il monitoraggio di un programma java con VisualVM, ho notato uno schema interessante nel comportamento del garbage collector. Sembra che molto spesso, subito dopo aver eseguito una "normale" raccolta di garbage collection, il GC esegua una seconda esecuzione molto più intensa della CPU, che sembra non avere alcun effetto aggiuntivo (l'heap usato dopo la corsa più aggressiva è più o meno lo stesso di è dopo la corsa più leggera).Perché Java Garbage Collector sembra eseguire una corsa aggressiva poco dopo aver fatto uno meno aggressivo?

Ho indicato sull'output di VisualVM in cui è possibile visualizzare le esecuzioni di Garbage Collector e le corrispondenti modifiche all'heap-usage.

interesting garbage collector behaviour

La mia domanda è fondamentalmente ciò che è il garbage collector fa qui e perché? Che cosa sta causando il tentativo di eseguire queste esecuzioni davvero intensive quando c'è abbondanza di memoria libera e nessun beneficio osservabile rispetto alle corse più leggere? O sto interpretando male il grafico?

Le prestazioni del programma non sono molto influenzate, sono solo curioso.

+1

Dubito che qualcuno qui sarà in grado di rispondere "perché". Probabilmente dovresti leggere il codice sorgente JVM per scoprirlo, e potrebbe cambiare in qualsiasi momento. –

+1

@JimGarrison Mi sento come se ci fosse almeno un utente SO che ha lavorato sulla JVM abbastanza per rispondere alla domanda ;-) – bdesham

risposta

2

Guardare i grafici è una buona cosa per avere una panoramica delle corse di GC, ma se vuoi studiare perché il GC è in esecuzione in un particolare momento, devi scavare in profondità nei log del GC.

Abilitare la registrazione GC completa, avviare la raccolta di jstat. Concentrati sulle ore in cui vedi i cicli GC inattesi e li rintraccia nei log. Cosa vedi lì? Prova a vedere:

  • è GC completo o secondario?
  • quali sono le occupazioni di eden, perm, oldGen, spazi dei sopravvissuti, ecc.?
  • Quali sono i tassi di allocazione, le dimensioni del set di dati in tempo reale, i tassi di promozione in questi intervalli?
  • ecc

Rispondere a queste domande si potrebbe portare al problema del perché il GC è in esecuzione.

UPDATE: puoi trovare i dettagli tecnici su come accordare GC, ad es. in: Is there a cookbook guide for GC problems?

+1

Per espandere un po 'questo, puoi usare -verbose: gc e -XX: + PrintGCDetails per davvero approfondire ulteriormente. –

+1

Per ottenere maggiori dettagli su GC, puoi provare VisualGC plugin per VisualVM. –