2012-04-26 21 views

Respuesta

12

Un OutOfMemopryError NO TERMINA JVM.

Si no se detecta, termina el HILO desde el que se inició el error. Otros hilos siguen funcionando perfectamente, a menos, por supuesto, que causen OutOfMemoryErrors también.

Solo después de que se hayan terminado todos los subprocesos o todos los subprocesos restantes sean subprocesos de daemon, se finaliza la JVM.

No termina la JVM porque no es necesario. La finalización de la JVM es una operación extrema de y no se realiza a la ligera.

No intentará recuperar ningún recurso, porque no hay nada que recuperar. La razón por la cual se arroja OOME es solo eso: JVM no puede adquirir un recurso porque se toman todos los recursos. Ya ha hecho todo lo demás que puede.

Hay que recordar que OOME no necesariamente se inserta en el hilo que consume más memoria. Un hilo puede consumir toda la memoria y ceder el procesamiento a otro hilo que intenta asignar "solo un byte". Por supuesto, falla y el hilo que intentó asignar el byte se ve interrumpido por un OOME. Esa es la razón por la cual recuperarse de un OOME es casi imposible.

1

Eso depende de si manejas ese error o no. Si no lo hace, la aplicación y el hilo actual con ella finalizarán. Si este subproceso pasa a ser el último subproceso en ejecución (en la mayoría de los casos, el subproceso principal de la aplicación actual), la JVM también saldrá (aunque aún puede hacer algún registro, crear un volcado de memoria, etc. antes de salir).

Si maneja el error normalmente solo trata de hacer un poco de limpieza, antes de detener la JVM. En la mayoría de los casos, es una mala idea tratar de recuperar desde un OutOfMemoryError. Para obtener más detalles, consulte aquí: Can the JVM recover from an OutOfMemoryError without a restart

+0

No. Solo termina el hilo. No toda la JVM. – Torben

+0

@Torben es suficiente, actualizaré mi respuesta. – Thomas

0

No termina solo, simplemente arroja un error que dice que no puede crear más objetos si la memoria no está disponible, aunque puede continuar el código manejando el error, pero tendrá que sobrevivir solo con los objetos creados actualmente, o puede liberar o anular los que ya no necesita.

PD: pero no es un método recomendado para manejar este tipo de errores y proceder

4

La JVM termina si y sólo si (al igual que con cualquier otra excepción o error) no está atrapado en cualquier lugar y no hay otros temas que son hilos demonio.

No termina inmediatamente porque el OutOfMemoryError se puede capturar y la aplicación puede intentar realizar algún tipo de gestión de errores, desde simplemente iniciar sesión en el error hasta descartar ese cálculo y continuar normalmente.

Esto último se considera arriesgado cuando ocurre un error pero a menudo es posible sin ningún problema, ya que muchos objetos pueden salir del alcance entre el punto donde se arroja el OutOfMemoryError y donde se captura, que luego puede liberarse recolección de basura para darle al programa nueva memoria para trabajar. Si el OutOfMemoryError se produjo porque un cálculo en particular requirió más memoria que la disponible y la aplicación hace algo más después, está bien.

0

En general, una JVM solo termina cuando sale la última cadena que no es daemon. Lanzar un OutOfMemoryError o cualquier otro tipo de error o excepción puede causar que exista el último hilo no-daemon si no se detecta.

Sin embargo, si se detecta el error y no se vuelve a lanzar o hay otro subproceso no-demonio ejecutándose, la JVM no sale. es decir, no hay nada especial sobre un error en particular al hacer que un programa salga.

Hay dos calificaciones

  • System.exit() hará que una JVM para iniciar el cierre y no puede ser capturado. Tener múltiples hilos no hace diferencia.
  • El error ThreadDeath es especial ya que no se imprime por defecto. De lo contrario, se comporta como cualquier otro error.
Cuestiones relacionadas