Proverò in breve a spiegare il problema. Lavoro nel dominio della supply chain in cui trattiamo articoli/prodotti e SKU.Scarse prestazioni dovute al garbage collector Java? Ho bisogno di suggerimenti
Dire che il mio intero problema è di 1 milione di SKU e sto eseguendo un algoritmo. Ora, la dimensione dell'heap JVM è pari a 4 GB.
Non riesco a elaborare tutti gli SKU in uno scatto poiché mi occorrerà molta più memoria. Quindi, divido il problema impostato in lotti più piccoli. Ogni lotto avrà tutti gli SKU correlati che devono essere elaborati insieme.
Ora eseguo diverse iterazioni per elaborare l'intero set di dati. Diciamo, se ogni lotto contiene ca. 5000 SKU, avrò 200 iterazioni/cicli. Tutti i dati relativi alle 5000 SKU sono necessari fino al completamento dell'elaborazione del batch. Ma quando inizia il prossimo lotto, i precedenti dati "batch" non sono richiesti e quindi possono essere raccolti.
Questo è lo sfondo del problema. Ora, arrivando al particolare problema di prestazioni dovuto a GC - Ogni lotto impiega circa 2-3 secondi per terminare. Ora, in questo momento, GC non è in grado di liberare alcun oggetto dal momento che tutti i dati sono necessari fino alla fine dell'elaborazione di un particolare batch. Quindi, GC sta spostando tutti questi oggetti sul vecchio Gen (Se guardo il profiler di yourkit, c'è quasi nulla nella nuova Gen). Quindi, la vecchia generazione sta crescendo più velocemente e serve un GC completo, il che rende il mio programma molto lento. C'è un modo per mettere a punto il GC in questo caso o può cambiare il mio codice per eseguire l'allocazione della memoria in un modo diverso?
PS: se ogni lotto è molto piccolo, non vedo questo problema. Credo che questo sia dovuto al fatto che il GC è in grado di liberare gli oggetti abbastanza velocemente dal completamento del batch più veloce e quindi non necessario per spostare oggetti nel vecchio gen.
Il ** profiler ** indica che è stato necessario più del 10% del tempo necessario per raccogliere i rifiuti? O è una supposizione? – RobAu
Modifica la soglia di durata. Come dipende dal tuo GC - quale GC stai usando? –
Qual è la durata del Full GC? –