RFR: 8267118: OutOfMemoryError cannot be caught as a Throwable [v3]
Coleen Phillimore
coleenp at openjdk.java.net
Tue Jun 1 23:16:28 UTC 2021
On Tue, 1 Jun 2021 02:41:43 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 incrementally with one additional commit since the last revision:
>
> Reworked the new logging to seperate Info and Debug levels to reduce verbosity, per
> feedback from @coleenp @iklam
Changes requested by coleenp (Reviewer).
test/hotspot/jtreg/runtime/Throwable/TestCatchThrowableOOM.java line 29:
> 27: * @summary Test catching Throwable doesn't trigger OOME
> 28: * @library /test/lib
> 29: * @run driver TestCatchThrowableOOM
Do you want to run this with -Xlog:exceptions=debug to verify that the debug statements print. I don't think you should verify them if you don't want to but make sure that the code is exercised going forward.
-------------
PR: https://git.openjdk.java.net/jdk/pull/4266
More information about the hotspot-runtime-dev
mailing list