- Per quanto ne so, lo spazio Heap è occupato solo da variabili di istanza. Se è corretto, allora perché questo errore si è verificato dopo aver eseguito correttamente per un po 'di tempo poiché lo spazio per le variabili di istanza viene assegnato al momento della creazione dell'oggetto.
Ciò significa che stai creando continuamente più oggetti nella tua applicazione per un periodo di tempo. I nuovi oggetti verranno archiviati nella memoria heap e questo è il motivo per la crescita della memoria heap.
Heap non contiene solo variabili di istanza. Memorizzerà tutti i tipi di dati non primitivi (oggetti). La durata di vita di questi oggetti può essere breve (blocco del metodo) o lunga (fino a quando non viene fatto riferimento all'oggetto nell'applicazione)
- C'è un modo per aumentare lo spazio dell'heap?
Sì. Dai un'occhiata a questo articolo di Oracle per maggiori dettagli.
Esistono due parametri per impostare la dimensione dell'heap:
-Xms:, che imposta la dimensione dell'heap iniziale e minima
-Xmx:, che imposta la dimensione massima dell'heap
- Quali modifiche dovrei apportare al mio programma in modo che occupi meno spazio nell'heap?
Dipende dalla tua applicazione.
Impostare la memoria heap massima in base ai requisiti dell'applicazione
Non causare perdite di memoria nella tua applicazione
Se trovi perdite di memoria nella tua applicazione, trova la causa principale con l'aiuto di strumenti di profiling come MAT , Visual VM , jconsole ecc. Una volta individuata la causa principale, correggi le perdite.
Note importanti da Oracle articolo
Causa: il messaggio dettagliato Spazio heap Java indica che non è stato possibile allocare l'oggetto nell'heap Java. Questo errore non implica necessariamente una perdita di memoria.
Possibili ragioni:
- Configurazione impropria (non allocare memoria sufficiente)
- L'applicazione trattiene involontariamente i riferimenti agli oggetti e ciò impedisce che gli oggetti vengano raccolti in modo indesiderato
- Applicazioni che fanno un uso eccessivo di finalizzatori. Se una classe ha un metodo finalize, gli oggetti di quel tipo non hanno il loro spazio recuperato al momento della garbage collection. Se il thread del finalizzatore non riesce a tenere il passo, con la coda di finalizzazione, l'heap Java potrebbe riempirsi e verrebbe generato questo tipo di eccezione OutOfMemoryError .
In una nota diversa, usa algoritmi di raccolta dei rifiuti migliori ( CMS o G1GC )
Dai un'occhiata a questa domanda per comprendere G1GC