Cuando Java no puede obtener suficiente memoria para asignar un objeto obtendrá un OutOfMemoryError.
En la práctica, la JVM puede demorar bastante tiempo en ejecutarse. Cuando se enfrenta a un problema de memoria, la JVM primero intentará eliminar la mayor cantidad de memoria posible. Dependiendo de la configuración de JVM (parámetros de GC y memoria de montón máxima), un ciclo de GC puede tomar de varios segundos a varios minutos con Xmx configurado en varios gigabytes. Peor aún, dependiendo de la memoria necesaria, la JVM puede realizar varios ciclos de GC antes de lanzar la excepción.
Cuando se lanza la excepción, se procesa como cualquier excepción no detectada. Como tal, se propagará a la parte superior de la pila de llamadas del hilo donde se produjo la excepción. Como la excepción no está capturada, el subproceso mostrará un stacktrace en System.err
antes de morir. Eso es todo. En un programa de subproceso único, esto hará que el programa salga. En un programa de subprocesos múltiples, la muerte de este subproceso puede liberar suficiente memoria para que el programa siga ejecutándose en una configuración inestable.
Mi recomendación si le preocupa el problema de memoria es que debe registrarse y UncaughtExceptionHandler para matar su programa cuando surge un problema de memoria, ya que es mejor detener el programa que dejarlo funcionar en un estado indefinido sin que nadie lo sepa .
Usted puede leer los siguientes artículos de Heinz Kabutz sobre el tema:
Es posible escribir código que se recupere de esta condición, siempre que tenga un buen motivo para detectar un problema conocido. Esto rara vez es una buena idea y, por lo general, la mejor opción es reducir la memoria consumida o aumentar la memoria máxima. –