juanjonavarro.com

secciones

Stacktraces "perdidas" en Java

Hoy, revisando un log de error de una aplicación Java me he encontrado con una cosa curiosa y que nunca había visto: Se estaba registrando una excepción, pero en lugar de mostrar toda la traza de la pila de llamadas (stacktrace) simplemente se estaba mostrando el nombre de la clase de excepción (en este caso un ArrayIndexOutOfBoundsException).

Después de investigar un rato he descubierto que esta es una optimización introducida en el JDK 5. En los casos en que una excepción se produzca en muchas ocasiones, la JVM puede optar por precrear la excepción y lanzar siempre la misma, sin generar nuevas. Esas excepciones precreadas no tienen información de stacktrace y por eso solo muestran su nombre.

En las notas del JDK 5 :

The compiler in the server VM now provides correct stack backtraces for all “cold” built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow

La solución, ya se puede ver, es usar el siguiente parámetro en el arranque de la JVM:

-XX:-OmitStackTraceInFastThrow

Comentarios cerrados para este artículo