RFR: 8267118: OutOfMemoryError cannot be caught as a Throwable [v5]

David Holmes david.holmes at oracle.com
Wed Jun 2 02:09:51 UTC 2021


On 2/06/2021 11:47 am, Coleen Phillimore wrote:
> On Tue, 1 Jun 2021 23:39:07 GMT, David Holmes <dholmes at openjdk.org> wrote:
> 
>>> This interesting little quirk was discovered by @iklam. During verification, the catch-type in a catch clause is normally resolved as part of being checked to see that it is a subclass of Throwable. At runtime when an exception is thrown, we also have to check if the exception being thrown is assignable to the catch-type and so handled by that catch block. For the case where the catch-type is Throwable itself, the verification subclass check trivially passes (due to a name match) without actually resolving the CP entry for the catch-type. So at runtime when the exception is thrown we have to perform the CP resolution of the catch-type. But the resolution process itself can trigger exceptions and in particular if we have thrown OutOfMemoryError, the resolution may throw a secondary OutOfMemoryError, which prevents the first from being caught by the catch block!
>>>
>>> The fix is to force resolution of the catch-type at verification time, when it is Throwable.
>>>
>>> To aid in debugging the original problem I've also added some new logging statements that show how we find a catch block and if we encounter further exceptions in trying to catch the exception - see example in the JBS issue.
>>>
>>> Testing: tiers 1-3, plus the new test
>>>
>>> Thanks,
>>> David
>>
>> David Holmes has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains six additional commits since the last revision:
>>
>>   - Merge branch 'master' into 8267118-oome
>>   - Simplified logging to reuse Info statements as suggested by @coleenp
>>   - Fix mh() usage
>>   - Reworked the new logging to seperate Info and Debug levels to reduce verbosity, per
>>     feedback from @coleenp @iklam
>>   - Merge branch 'master' into 8267118-oome
>>   - 8267118: OutOfMemoryError cannot be caught as a Throwable
> 
> Thanks for making the changes.  It looks good!  Thank you for fixing this.

Thanks for the review Coleen!

> src/hotspot/share/oops/method.cpp line 263:
> 
>> 261:         return handler_bci;
>> 262:       } else if (ex_klass == NULL) {
>> 263:         // Is this even possible?
> 
> Good question. this seems odd - there should always be a klass.  Maybe investigate as a follow up.

I'm not sure if this is just the code being "robust" or not. I tried 
tracking back to see if a NULL could sneak in anywhere but the code 
paths get complicated on the JVM TI side.

Thanks,
David

> -------------
> 
> Marked as reviewed by coleenp (Reviewer).
> 
> PR: https://git.openjdk.java.net/jdk/pull/4266
> 


More information about the hotspot-runtime-dev mailing list