RFR: 8066859: java/lang/ref/OOMEInReferenceHandler.java failed with java.lang.Exception: Reference Handler thread died
David Holmes
dholmes at openjdk.org
Mon Jul 11 15:02:10 UTC 2022
On Fri, 8 Jul 2022 11:44:53 GMT, Doug Lea <dl at openjdk.org> wrote:
> 8066859 : java/lang/ref/OOMEInReferenceHandler.java failed with java.lang.Exception: Reference Handler thread died
src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java line 296:
> 294: byte spins = 0, postSpins = 0; // retries upon unpark of first thread
> 295: boolean interrupted = false, first = false;
> 296: Node pred = null, t; // predecessor of node when enqueued
Nit: please don't use this style of multi-variable declaration as they are very easy to mis-read. Also the comment only applies to one of the variables.
src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java line 1626:
> 1624: }
> 1625: if (!isHeldExclusively() || !release(savedState = getState()))
> 1626: throw LockSupport.staticIllegalMonitorStateException; // OOM
How is it possible to get IMSE this deep into the code? And the comment is confusing - OOM?
src/java.base/share/classes/java/util/concurrent/locks/LockSupport.java line 463:
> 461: * Preallocated exceptions thrown if acquiring or releasing locks
> 462: * when OutOfMemory.
> 463: */
I don't see why this should be necessary. IMSE is thrown before any state changes occur and so it is is fine if the IMSE is replaced by OOME.
Even IE should be safe at the points it is thrown.
Also in both cases you want to see a full and proper stacktrace.
-------------
PR: https://git.openjdk.org/jdk/pull/9427
More information about the core-libs-dev
mailing list