En general, nunca debe escribir un bloque catch que capture java.lang.Error
o cualquiera de sus subclases, incluido OutOfMemoryError
. La única excepción a esto sería si está utilizando una biblioteca de terceros que arroja una subclase personalizada de Error
cuando deberían haber subclasificado RuntimeException
. Sin embargo, esto es solo una solución para un error en su código.
Desde el JavaDoc para java.lang.Error
:
Un error es una subclase de Throwable que indica problemas serios que una aplicación razonable no debe tratar de atrapar.
Si tiene problemas con que su aplicación continúe ejecutándose incluso después de que uno de los hilos muera debido a un OOME, tiene un par de opciones.
En primer lugar, es posible que desee comprobar si es posible marcar los hilos restantes como hilos daemon. Si alguna vez hay un punto en el que solo los hilos daemon permanecen en la JVM, ejecutará todos los enganches de cierre y terminará lo más ordenadamente posible. Para hacerlo, deberá llamar al setDaemon(true)
en el objeto de hilo antes de que se inicie. Si los hilos son realmente creados por un marco o algún otro código, puede que tenga que usar un medio diferente para establecer ese indicador.
La otra opción es asignar un controlador de excepciones no detectadas a los hilos en cuestión y llamar al System.exit()
o si es absolutamente necesario Runtime.getRuntime().halt()
. La detención de llamadas es muy peligrosa ya que los ganchos de apagado ni siquiera intentarán ejecutarse, pero en ciertas situaciones la detención podría funcionar donde System.exit hubiera fallado si ya se hubiera lanzado un OOME.
Sobre todo lo que puedo decir es que el manejo de un error de falta de memoria es muy * * difícil. Cualquier controlador que tenga debe tener cuidado de no crear CUALQUIER objeto nuevo: use objetos creados previamente (y tenga cuidado con las modificaciones que puedan hacer asignaciones). –