@Stefan Really good work, that's a really interesting read.
That also explains why I haven't seen this happen for a while which is good.
I'm still not exactly clear what happens the the OutOfMemoryError or StackOverflowError. If this error get thrown, but not caught, you should go through each finally block down the stack until the JVM exits? If one finally block tries to create new objects (which it seems like calling unlock on a ReentrantLock might) then that finally should throw, and you will drop out into the next enclosing finally (which may do the same) and so on, but the Throwable itself shouldn't disappear unless its caught? So for "normal" execution to resume the Throwable must be caught? I can't see anywhere in Guava where that could happen, there are a few places in Jython but non look very likely to me, how does normal execution resume?
Do you have any way to reproduce this?
I'm really glad someone is looking at this one, I tried to reproduce it for a while and eventually gave up.