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.
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.
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. –
@JimGarrison Mi sento come se ci fosse almeno un utente SO che ha lavorato sulla JVM abbastanza per rispondere alla domanda ;-) – bdesham