UnknownError, InternalError
Bart Jacobs
bart.jacobs at cs.kuleuven.be
Thu May 22 09:33:15 PDT 2008
Hi all,
The Java Virtual Machine Specification (JVMS) states that the JVM can
throw UnknownError and InternalError exceptions anywhere. (I.e., any
bytecode instruction can throw these exceptions.) However, I presume
that when running a program on a given build of the actual OpenJDK JVM,
there are certain instructions that never actually throw such an
exception. So, my question is: How bad is it really? Where can the
current build of the OpenJDK JVM actually throw these exceptions? Can a
programmer make stronger assumptions if he knows he's running on the
OpenJDK? And how stable would those assumptions be under evolution of
the JVM implementation?
My hypothesis is that you can't really make any assumptions as to the
program points where these exceptions can occur, especially because of
JIT optimizations that move instructions around. Would this be a fair
assessment? Or would this be overly cautious?
The reason I'm asking is because I'm doing research into how to
facilitate writing Java programs that preserve their safety properties
even in the presence of these internal exceptions. In Java as it is
today, this is not trivial, especially if the program catches Throwable
or uses try-finally statements or synchronized statements. If it were
the case that internal exceptions could be ruled out at certain classes
of program points, then this would seem to make it more feasible to deal
with them on a case-by-case basis, rather than trying to provide a
blanket solution for internal exceptions occurring in a computation,
regardless of the specific program point where they occur.
This is especially relevant for small pieces of code in a finally block.
Are there categories of such code that are guaranteed to execute to
completion successfully? In certain other execution engines, a
programmer needs to specially "prepare" such a block of code (by marking
it specially in a way recognized by the runtime) to ensure that no
internal exception can happen within that block due to the JITter
running out of memory, or because of a lack of stack space. Would
something similar be necessary for the OpenJDK JVM, or does this source
of internal exceptions not exist there?
(My current thinking on a new language construct for facilitating
writing programs with provably safe exception handling is at
<http://www.cs.kuleuven.be/publicaties/rapporten/cw/CW516.pdf>.)
Many thanks in advance for any feedback!
Bart Jacobs
Postdoc at Dept. Computer Science, Katholieke Universiteit Leuven, Belgium
http://www.cs.kuleuven.be/~bartj/papers.html
More information about the hotspot-dev
mailing list