Quando Java non può ottenere abbastanza memoria da allocare un oggetto si otterrà un OutOfMemoryError.
In pratica l'eccezione può richiedere del tempo per essere effettivamente lanciata dalla JVM. Di fronte al problema della memoria, la JVM prima tenterà di spazzare più memoria possibile. A seconda della configurazione JVM (parametri GC e memoria heap massima), un ciclo GC può richiedere da alcuni secondi a diversi minuti con Xmx impostato su diversi gigabyte. Ancora peggio, a seconda della memoria necessaria, la JVM può eseguire diversi cicli GC prima di lanciare l'eccezione.
Quando l'eccezione è lanciata, viene elaborata come qualsiasi eccezione non rilevata. Come tale si propagherà all'inizio dello stack chiamante del thread in cui è stata sollevata l'eccezione. Poiché l'eccezione non viene visualizzata, il thread mostrerà uno stacktrace su System.err
prima di morire. È tutto. In un programma a thread singolo questo farà uscire il programma. In un programma multi-thread, questo thread death può liberare abbastanza memoria affinché il programma continui a girare in una configurazione instabile.
La mia raccomandazione se sei preoccupato per il problema di memoria è che dovresti registrarti e UncaughtExceptionHandler per uccidere il tuo programma quando sorge un problema di memoria dato che è sicuramente meglio interrompere il tuo programma piuttosto che farlo funzionare in uno stato indefinito senza che nessuno sappia .
è possibile leggere le seguenti articoli da Heinz Kabutz sul tema:
È possibile scrivere codice che recupera da questa condizione, purché si abbia un buon motivo per rilevarlo per un problema noto. Raramente è una buona idea e ridurre la memoria consumata o aumentare la memoria massima è solitamente l'opzione migliore. –