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