Ho un database in cui memorizzo le fatture. Devo eseguire operazioni complesse per ogni mese con una serie di algoritmi che utilizzano le informazioni di tutte le fatture. Il recupero e l'elaborazione dei dati necessari per queste operazioni richiede una grande quantità di memoria poiché potrebbero esserci molte fatture. Il problema diventa sempre più grave quando l'intervallo richiesto dall'utente per questi calcoli arriva a diversi anni. Il risultato è che sto ottenendo un'eccezione PermGen perché sembra che il garbage collector non stia facendo il suo lavoro tra un calcolo mensile.Esiste un modo per liberare memoria durante l'elaborazione di dati di grandi dimensioni?
Ho sempre usato System.GC per suggerire al GC di fare il suo lavoro non è una buona pratica. Quindi la mia domanda è, ci sono altri modi per liberare la memoria a parte questo? È possibile forzare la JVM a utilizzare lo scambio HD per memorizzare temporaneamente i calcoli parziali?
Inoltre, ho provato a utilizzare System.gc alla fine di ogni mese di calcolo e il risultato è stato un elevato utilizzo della CPU (a causa del cosiddetto "garbage collector") e un utilizzo di memoria ragionevolmente inferiore. Questo potrebbe fare il lavoro ma non penso che questa sarebbe una soluzione adeguata.
Se ci mostra un frammento del codice, potremmo fornire una guida migliore. Forse le tue variabili sono nel campo di applicazione sbagliato e quindi essere vivo troppo tempo. –
A seconda del tipo di operazioni eseguite sui dati, potrebbe essere più veloce utilizzare direttamente il database per eseguire tali operazioni invece di caricare i dati in java, creare oggetti e allocare memoria ... Anche se questo non risponde alla domanda, ma se le tue operazioni sono principalmente * spostando * i numeri intorno, * facendo alcuni calcoli *, * leggendo * e * scrivendo * di nuovo .. beh allora il tuo database può eseguire quelle operazioni più velocemente, poiché è "* più vicino alla sorgente *" – GameDroids