Después de un OutOfMemoryError, ¿JVM termina por sí mismo? Si no, ¿por qué? ¿Tratará de recuperar los recursos? ¿O hay alguna otra razón?¿JVM termina después de OutOfMemoryError
Respuesta
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.
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
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
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.
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.
- 1. OutOfMemoryError - cómo matar a la JVM después de crear el hprof
- 2. JMeter OutOfMemoryError
- 3. Java JIT Compiler causando OutOfMemoryError
- 4. Muy extraño OutOfMemoryError
- 5. cómo atrapar OutOfMemoryError en JVM y ejecutar un script si está atrapado?
- 6. OutOfMemoryError crear mapas de bits
- 7. cómo resolver OutOfMemoryError usando LayerDrawable
- 8. ImageView causa OutOfMemoryError
- 9. Junit output y OutOfMemoryError
- 10. lotes JDBC Insertar OutOfMemoryError
- 11. Maven Cobertura OutOfMemoryError
- 12. Java OutOfMemoryError doubt
- 13. OutOfMemoryError en BigInteger
- 14. java outOfMemoryError con stringbuilder
- 15. ¿Es una mala idea capturar OutOfMemoryError?
- 16. OutputStream OutOfMemoryError al enviar HTTP
- 17. ¿Cómo termina JVM los hilos daemon? o Cómo escribir hilos daemon que terminan correctamente
- 18. Cargando imágenes grandes sin OutOfMemoryError
- 19. OutOfMemoryError ¿qué aumentar y cómo?
- 20. Maven build OutOfMemoryError Chunck :: new
- 21. Scala: Mutable vs. Inmutable Object Performance - OutOfMemoryError
- 22. Configuración de Eclipse JVM
- 23. android - Cómo mostrar el cuadro de diálogo después de que termina la actividad
- 24. JUnit termina subprocesos secundarios
- 25. urlsafe_b64encode siempre termina en '='?:
- 26. ¿Por qué termina mi supervisor?
- 27. OutOfMemoryError en un subproceso Java separado
- 28. ¿Por qué la instrucción While (rs.next()) termina después de la 1ra iteración?
- 29. Programa Java que termina después de ObjectMapper.writeValue (System.out, responseData) - Biblioteca Jackson
- 30. ¿Cómo saber si la aplicación se termina por el usuario o iOS (después de fondo 10min)
No. Solo termina el hilo. No toda la JVM. – Torben
@Torben es suficiente, actualizaré mi respuesta. – Thomas